Unity-着色器在Android(OpenGL)和编辑器(DX11)上的工作方式不同
我编写了圆形剪切精灵着色器,它在编辑器和独立版本中工作正常,但在Android设备上的行为不正确 本质上,它是一个简单的像素着色器:Unity-着色器在Android(OpenGL)和编辑器(DX11)上的工作方式不同,android,opengl-es,unity3d,directx,shader,Android,Opengl Es,Unity3d,Directx,Shader,我编写了圆形剪切精灵着色器,它在编辑器和独立版本中工作正常,但在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
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。附加压缩测试项目:30kB在atan2中,当y参数从上面的eg-In.texcoord.x-0.5~=+0接近零时,您将开始获得接近PI的值,因为您将获得arctany/x+PI,其中y~=0,arctan0=0。Android版本大概使用的是较低精度的浮点运算,因此这一点在那里更为明显。如果你在桌面版本上放大的足够多,你可能会看到像素也不符合你的条件。更新到Unity的新版本后,问题自行解决。根据wiki上的说法,atan2只有在x==0和y==0时才是未定义的,所以这不是案例更新后的答案。。。答案的本质是正确的,但案例并不完全正确。在atan2中,当y参数从上方接近零时,例如-In.texcoord.y+0.5~=+0,您能否澄清您指的是哪个参数?atan2被定义为atan2y,x,但您与-IN.texcoord.y+0.5相关,我将其用于x第二个参数。再次更新答案以更正参数值。。。同样的论点成立。atan2的第一个y参数不是0或接近我放置黄点的位置,但它仍然渲染不正确。