Unity-仅Shader Alpha不适用于iOS版本

时间:2019-04-04 11:10:11

标签: ios unity3d textures shader

我的着色器遇到问题,但仅在iOS上才有。我正在尝试在屏幕上呈现屏幕截图。我了解到,在屏幕截图中获得正确透明度的方法是:拍摄一张黑色背景的屏幕截图,一张白色背景的屏幕,然后使用公式校正颜色。我创建了具有两个额外纹理属性的着色器,以包含这些黑白屏幕截图。它的胆量是:

        fixed4 frag(v2f IN) : SV_Target
        {
            half4 blackColor = tex2D(_BlackTex, IN.texcoord);
            half4 whiteColor = tex2D(_WhiteTex, IN.texcoord);
            float alphaMultiplier = 1 + blackColor.r - whiteColor.r;
            half4 color = half4(1, 1, 1, 0);

            color.r = blackColor.r / alphaMultiplier;
            color.g = blackColor.g / alphaMultiplier;
            color.b = blackColor.b / alphaMultiplier;
            color.a = alphaMultiplier;


            #ifdef UNITY_UI_CLIP_RECT
            color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
            #endif

            #ifdef UNITY_UI_ALPHACLIP
            clip (color.a - 0.004);
            #endif

            return color;
        }

这在Android以及PC和Mac上的编辑器中均有效。但是,在iOS上,屏幕截图中完全透明的部分显示为完全不透明(黑色,这是我们所期待的)。

            color.r = alphaMultiplier;
            color.g = alphaMultiplier;
            color.b = alphaMultiplier;
            color.a = 1;

更改着色器,以便屏幕截图的颜色由不透明度定义,不透明的图像部分应显示为白色,而透明的图像部分应显示为黑色。如果透明区域在我的版本中显示为黑色,则我希望整个屏幕截图为白色。不是。图像的正确部分是黑白的。

            color.r = alphaMultiplier;
            color.g = alphaMultiplier;
            color.b = alphaMultiplier;
            color.a = 0;

然后,我尝试将所有像素的alpha硬编码为0,以查看iOS版本是否能够完全显示真实的透明度。是的,图像是不可见的。

            color.r = blackColor.r; // 0, 0
            color.g = whiteColor.r; // 255, 1
            color.b = alphaMultiplier; // 0, 0
            color.a = 1;

最后,我尝试从黑白纹理设置像素的rgb值。着色器很难调试,因此我的目的是能够在图像编辑器中打开构建的屏幕截图以“调试”它们的值。这些值取自完全透明的部分,如上所示。它们正是使着色器正常工作所需要的。

我真的不知道该怎么办。我的所有三项测试都为着色器提供了完美世界中的效果,我发现它们没有任何缺点。但是,对于所有相反的证据,它在测试之外仍然无法正常工作。每个部分透明的像素都能完美呈现,只有完全透明的像素不起作用,并且只能在iOS版本上使用。我可以认为我没有测试过的唯一事情是,在所有测试中均对Alpha进行了硬编码。我不认为那应该有什么不同。我所有的测试都表明一切都应该正确渲染。请帮助我。

            color.r = blackColor.r / alphaMultiplier;
            color.g = blackColor.g / alphaMultiplier;
            color.b = blackColor.b / alphaMultiplier;
            color.a = min(max(blackColor.r, 0.25), 0.5);

编辑:作为一项最终测试,我将我的主要代码用于rgb,对于alpha,我使用了一个我最小/最大在0.25到0.5之间的变量。屏幕的正常区域是半透明的,但是应该完全透明的区域还是不透明的。我正式没有头绪。任何帮助都将非常,非常感谢。

0 个答案:

没有答案