GLSL 色调着色器产生奇怪的结果,仅 IOS?

GLSL hue shader producing odd results, IOS only?

我有一个跨平台的 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;
}

显然有一些非常奇怪的伪像似乎会影响某些区域,特别是 black/white 颜色。但通常也会注意到颜色的细微变化,这不能归因于所需的色调变化效果。

总的来说,这个着色器在 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