我有一个跨平台的LibGDX应用程序。此特定的GLSL着色器代码用于移动特定纹理的色相。
[它在Android上和在台式机上调试时都很好,但是在iPad上,这是结果(请显示屏幕照片,这是从此设备获取数据的最简单方法)。
代码:
const mat3 rgb2yiq = mat3(0.299, 0.595716, 0.211456, 0.587, -0.274453, -0.522591, 0.114, -0.321263, 0.311135);
const mat3 yiq2rgb = mat3(1.0, 1.0, 1.0, 0.9563, -0.2721, -1.1070, 0.6210, -0.6474, 1.7046);
vec4 outColor = texture2D(u_texture, v_texCoord) * v_color;
float alpha = outColor.a;
// Hue shift
if (u_hueAdjust > 0.0 && u_hueAdjust < 1.0 && alpha > 0.0)
{
vec3 unmultipliedRGB = outColor.rgb / alpha;
vec3 yColor = rgb2yiq * unmultipliedRGB;
float originalHue = atan(yColor.b, yColor.g);
float finalHue = originalHue + u_hueAdjust * 6.28318; //convert 0-1 to radians
float chroma = sqrt(yColor.b * yColor.b + yColor.g * yColor.g);
vec3 yFinalColor = vec3(yColor.r, chroma * cos(finalHue), chroma * sin(finalHue));
outColor.rgb = (yiq2rgb * yFinalColor) * alpha;
}
显然,有一些看起来很奇怪的伪像似乎会影响某些区域,尤其是黑色/白色。但通常也要注意,颜色的细微变化并非归因于所需的色相变化效果。
总的来说,此着色器在IOS上不太适合(但在Android / Desktop上可以正常工作,但是在玩了一段时间后,我完全没主意了,有人引导我朝着正确的方向前进吗?
在atan的文档中,它说The result is undefined if x=0.
。
yColor.g
可能在灰度上为零吗?
这里讨论了这个问题:Robust atan(y,x) on GLSL for converting XY coordinate to angle