首页 > 解决方案 > Unity - 着色器 alpha 仅适用于 iOS 构建

问题描述

我的着色器出现问题,但仅在构建到 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 之间的范围内。屏幕的正常区域是半透明的,但应该完全透明的区域又是不透明的。我正式不知道。任何帮助都会非常非常感谢。

标签: iosunity3dtexturesshader

解决方案


推荐阅读