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 后问题自行解决。
我编写了圆形镂空精灵着色器,它在编辑器和独立版本中工作正常,但在 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 后问题自行解决。