我正在使用GL_TRIANGLE_STRIP的一次绘制调用来渲染2个三角形以构成一个正方形。
我使用以下方法计算着色器中的位置和紫外线:
vec2 uv = vec2(gl_VertexID >> 1, gl_VertexID & 1);
vec2 position = uv * 333.0f;
float offset = 150.0f;
mat4 model = mat4(1.0f);
model[3][1] = offset;
gl_Position = projection * model * position;
投影是与屏幕尺寸匹配的常规正投影。
在片段着色器中,我想用蓝色绘制每个像素的第一行,并用红色绘制每个像素的第二行。
int v = int(uv.y * 333.0f);
if (v % 2 == 0) {
color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
} else {
color = vec4(0.0f, 0.0f, 1.0f, 1.0f);
}
这行得通,但是,如果我使用offset可以给我一个亚像素转换:
offset = 150.5f;
这两个三角形没有匹配的uv,如图所示:
我在做什么错了?
答案 0 :(得分:2)
属性插值仅以有限的精度完成。这意味着由于舍入误差,即使1 ulp
中的差异(单位末位,即最低有效数字)也可能导致结果舍入到另一个方向。由于两个三角形之间的硬件插值单元中的运算顺序可能不同,因此舍入之前的值可能会略有不同。 OpenGL不提供任何保证。
例如,您可能在上三角获得1.499999
,在下三角获得1.50000
。因此,当您添加偏移量0.5
时,1.99999
将四舍五入为1.00000
,而2.000000
将四舍五入为2.00000
。
如果像素完美的结果对您很重要,建议您从uv
手动计算gl_FragCoord.xy
坐标。如您的示例中那样,在轴对齐的矩形中,这样做很简单。