【问题标题】:How do I half texel offset when not ortho rendering?不正交渲染时如何将纹理像素偏移减半?
【发布时间】:2017-12-28 21:34:19
【问题描述】:

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

我正在使用:

  • GL_NEAREST 最小/最大纹理过滤。
  • texture 片段着色器上的函数。
  • 1024x1024 的精灵图集,带有所需的精灵 @ (x=320,y=732,width=8,height=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(使用深色纹理更容易看到出血):

渲染 #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 中减去)和不同的值,但都不起作用。我不知道我错过了什么;我认为这不是 T 形接头问题,因为出血像素颜色来自纹理(而不是背景)。

【问题讨论】:

    标签: opengl texture-mapping


    【解决方案1】:

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

    你可以做的是将你的纹素坐标限制在 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;
    

    【讨论】:

    • 有趣。所以除非我钳制到 [0,1] 或使用正射渲染,否则我必须钳制片段着色器中的坐标?
    • 是的。如果您在此之前执行此操作,它不会重新组装夹具到边缘,而是会拉伸纹理。唯一应该发生某些事情的地方是在 [320, 320.5] 和 [327.5, 328] 之间的区域。纹理上的其他任何地方都不需要做任何特别的事情。投影(正交或透视)根本没有任何区别。即使使用正交渲染,您也必须在片段着色器中执行此操作。
    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多