我的着色器遇到问题,但仅在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之间的变量。屏幕的正常区域是半透明的,但是应该完全透明的区域还是不透明的。我正式没有头绪。任何帮助都将非常,非常感谢。