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

问题描述 投票:1回答:1

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

我正在使用:

  • GL_NEAREST最小/最大纹理过滤。
  • 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减去)和不同的值,没有一个工作。我不知道我错过了什么;我不认为这是一个丁字裤问题,因为出血的像素颜色来自纹理(而不是背景)。

opengl texture-mapping
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.