You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GLSL片段着色器问题:眼部白色像素无法转为红色

问题分析与修正方案

核心错误点

你的白色像素判断逻辑存在两个关键问题:

  1. 仅单通道判断片面:黑白纹理中白色像素的RGB三个通道值是相等的(均接近1.0),只判断红色通道pixelColor.x会误判灰色像素,或因纹理格式问题导致判断失效。
  2. 阈值设置不合理:0.3的阈值过低,会把大量非白色的灰色像素纳入判断;若你的纹理是反转的黑白图(白色为0,黑色为1),则阈值逻辑完全颠倒。

修正步骤

方案1:针对标准黑白纹理(白色RGB≈1.0)

  • 同时检查RGB三个通道的最小值,确保像素接近纯白
  • 把阈值调高到0.9(可根据实际纹理调整,比如0.85)

修正后的判断代码:

vec4 pixelColor = texture(yourTextureSampler, uv);
// 保留原有眼部UV区域判断逻辑
float isEyeArea = /* 你的UV区域判断代码,比如step(uv.x, 0.5) * step(0.3, uv.y) */;

// 正确的白色像素判断:三个通道最小值大于0.9,确保是纯白/接近纯白
float isPixelWhite = step(0.9, min(pixelColor.r, min(pixelColor.g, pixelColor.b)));

// 仅当同时满足眼部区域+白色像素时,替换为红色
vec4 finalColor = mix(pixelColor, vec4(1.0, 0.0, 0.0, 1.0), isEyeArea * isPixelWhite);
gl_FragColor = finalColor;

方案2:针对反转黑白纹理(白色RGB≈0.0,黑色≈1.0)

如果你的纹理是反转的(比如白色显示为0值),则需要反转阈值判断逻辑:

// 判断像素是否接近0(即白色)
float isPixelWhite = step(pixelColor.r, 0.1);

额外注意:纹理色彩空间问题

如果你的纹理是sRGB格式,采样后需要先转换为线性空间再判断,否则白色的实际数值会低于预期:

vec4 pixelColor = texture(yourTextureSampler, uv);
// sRGB转线性空间
pixelColor.rgb = pow(pixelColor.rgb, vec3(2.2));
// 后续判断逻辑同上

验证方法

可以先单独输出isPixelWhite对应的颜色(比如把gl_FragColor设为vec4(isPixelWhite, isPixelWhite, isPixelWhite, 1.0)),查看哪些像素被判定为白色,以此调整阈值和判断逻辑。

内容的提问来源于stack exchange,提问作者Ettur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 10:08:06