在不进行正交渲染时,如何进行半纹素偏移?

时间:2017-12-28 13:14:31

标签: opengl texture-mapping

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

我正在使用:

  • GL_NEAREST min / max纹理过滤。
  • 片段着色器上的
  • texture函数。
  • 精灵图集1024x1024,带有所需的精灵@(x = 320,y = 732,宽度= 8,身高= 8)

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(纹理较暗,以便更容易看到出血): enter image description here

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

我知道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;

enter image description here

我尝试了一堆可能的S& T偏移组合(向S& T加上0.5,从两者中减去,加上T但从S减去)和不同的值,没有一个工作。我不知道自己错过了什么;我不认为这是一个丁字裤问题,因为流血的像素颜色来自纹理(而不是背景)。

1 个答案:

答案 0 :(得分:3)

只有减去或添加半个纹素偏移量才能解决问题,因为你总是将问题放在一边。

您可以做的是将纹理坐标系在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;