Unity - 着色器在 Android (OpenGL) 和编辑器 (DX11) 上的工作方式不同

Unity - shader works differently on Android (OpenGL) and Editor (DX11)

我编写了圆形镂空精灵着色器,它在编辑器和独立版本中工作正常,但在 Android 设备上运行不正确。

本质上它是简单的像素着色器:

fixed4 frag(pixelData IN) : SV_Target
{
 const float PI = 3.1415;
 float angle = -atan2(IN.texcoord.x - 0.5, -IN.texcoord.y + 0.5) + PI;

 if (angle < _Percent * 2 * PI) //_Percent is in range from 0 to 1        
     return tex2D(_MainTex, IN.texcoord) * IN.color;            
 else
     return float4(1,1,1,0);            
}

在编辑器中渲染(DX9 GPU 上的 DX11)

截图来自 Android (OpenGL - Nexus 4)

正如您在中间看到的那样,有些像素应该是红色的

我正在使用 Unity 5.0.0f4。附加压缩测试项目:ShaderTest.zip (30kB)

atan2 中,随着 y 参数从上方接近零(例如 - IN.texcoord.x - 0.5 ~= +0),您将开始获得接近 PI 的值,因为您将获得arctan(y/x) + PI,其中 y ~= 0,以及 arctan(0) = 0 (http://en.wikipedia.org/wiki/Atan2)。 Android 版本可能使用了较低精度的浮点运算,因此这在那里更为明显。如果您在桌面版本上放大得足够大,您可能也会看到不符合条件的像素。

更新到较新版本的 Unity 后问题自行解决。