片段着色器中像素选择异常问题求助
片段着色器绘制矩形的像素选择问题
我编写了一个绘制矩形的简单着色器,希望通过片段坐标在片段着色器中改变颜色。采用归一化UV绑定顶点的基础实现可运行,但渲染结果不可靠——无论如何处理UV,都无法准确选中目标像素,有时会误选相邻像素。
为简化问题,我尝试通过UV绘制子矩形,代码如下:
uniform vec2 size; // 子矩形在归一化空间中的尺寸 in vec2 uv; void main() { vec2 mask_xy = step(uv, size); float mask = mask_xy.x * mask_xy.y; color = mix(vec4(1,0,0,1), vec4(0,0,1,1), mask); }
当我指定9×9像素的子矩形尺寸时,有时渲染正确,有时却变成10×9。该问题受多种因素影响:
- 视口大小(若归一化存在问题可能合理)
- 仅移动窗口内的矩形位置,渲染结果也会变化
即便在正方形窗口中绘制正方形形状、指定正方形尺寸,x轴与y轴的渲染结果仍不对称,这令我十分困扰。需注意,矩形本身的几何形状始终正确,顶点位置无异常。
我曾尝试在step函数中加入epsilon值以避免舍入误差,但未发现有效规律。之后改用gl_FragCoord替代UV,实现代码如下:
uniform vec2 size; // 子矩形在窗口空间中的尺寸 uniform vec4 box; // [xmin, xmax, ymin, ymax] 窗口空间坐标 void main() { vec2 mask_xy = step(gl_FragCoord.xy - box.xz, size); float mask = mask_xy.x * mask_xy.y; color = mix(vec4(1,0,0,1), vec4(0,0,1,1), mask); }
gl_FragCoord应以像素中心为基准,step函数本应能准确识别边界,但该实现仍存在相同问题。
我已无计可施,特求助解决方案。注:我仅在以下特定渲染器中测试:
- GL_RENDERER: llvmpipe (LLVM 7.0, 128 bits)
- GL_VENDOR: VMware, Inc.
- GL_VERSION: 3.1 Mesa 18.3.6
内容的提问来源于stack exchange,提问作者Kiwi
相关产品推荐
相关产品推荐

