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