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

片段着色器中像素选择异常问题求助

片段着色器绘制矩形的像素选择问题

我编写了一个绘制矩形的简单着色器,希望通过片段坐标在片段着色器中改变颜色。采用归一化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:30:25