非正交渲染时如何将纹素偏移减半?

How do I half texel offset when not ortho rendering?

我的渲染沿着这两个垂直四边形的边缘流出像素(红色的点)。

我正在使用:

s1 = 320.0f/1024.0f; s2 = (320.0f+8.0f)/1024.0f; t1 = 732.0f/1024.0f; t2 = (732.0f+8.0f)/1024.0f;

渲染 #1(使用深色纹理以便更容易看到出血):

渲染 #2:(具有用于计算纹素的明亮纹理,但红色像素仍然存在):

我知道 OpenGL 的 texture 函数会在像素中心采样,但是当我尝试将 "S,T" 坐标偏移半个像素时,它(修复它但是)有不利的效果。

例如,下面的纹理坐标缩小了沿精灵边界的纹理元素的宽度。

s1 = (0.5f+320.0f)/1024.0f; s2 = (0.5f+320.0f+8.0f)/1024.0f; t1 = (-0.5f+732.0f)/1024.0f; t2 = (-0.5f+732.0f+8.0f)/1024.0f;

我尝试了一堆可能的 S&T 偏移组合(向两个 S&T 加 0.5,从两者中减去,加到 T 但从 S 中减去)和不同的值,none 它起作用了。我不知道我错过了什么;我认为这不是 T 型接头问题,因为渗色像素颜色来自纹理(而不是背景)。

仅减去或增加半个纹素偏移永远无法解决问题,因为您总是将问题放在一边。

你可以做的是将你的纹素坐标限制在 x+0.5 和 x+width-0.5 的范围内,这将防止两侧出血。代码可能如下所示:

s = clamp(texCoord.x, 320 + 0.5, 320 + 8 - 0.5) / 1024;
t = clamp(texCoord.y, 732 + 0.5, 732 + 8 - 0.5) / 1024;