OpenGL - 纹理图集“污迹”

时间:2011-08-04 17:11:17

标签: opengl texturing

我正在使用纹理图集,我通过将2个相同尺寸的图像并排拼接而成。 当我修改纹理坐标时,我按以下顺序执行以下操作:

  1. if(texCoordx>1) texCoordx = texCoordx % 1 - 所以一个纹理不会泄漏到另一个纹理中。
  2. if(texCoordx<0) texCoordx = 1 + texCoordx - 同样,一个纹理不会泄漏到另一个纹理中。
  3. 将纹理坐标缩放0.5。
  4. 如果想在右侧绘制纹理,请添加0.5。
  5. 这大部分都很好,但是,我似乎在纹理 s 坐标接近1和0的边缘处“弄脏”。它看起来像是沿着 t 轴。我附上了截图。

    Image smudged at border

    我知道找到了一个答案here,但它只是略微缩小了污迹。我正在使用自己的着色器,但它没有对纹理坐标进行任何修改。我也在启用GL_REPEAT。有人知道任何可能的原因/解决方案吗?

1 个答案:

答案 0 :(得分:4)

如果我正确地解释你的图片,这个纹理是地图集中的两个纹理(假设左边)之一,你的原始texCoords是(从左到右)类似

0.2, 0.4, 0.6, 0.8, 1, 1.2, 1.4, 1.6, 1.8, 2
在你自己在第1步中包装之后,你现在有了像

这样的东西
0.2, 0.4, 0.6, 0.8, 1, 0.2, 0.4, 0.6, 0.8, 1

,后来成了

0.1, 0.2, 0.3, 0.4, 0.5, 0.1, 0.2, 0.3, 0.4, 0.5

这里我们看到0.5,0.1处的问题,其中单调性发生变化。 OpenGL不知道你想要在左右方向从0.5到0.1。它只是取差值,即-0.4,因此从右到左插回到纹理的开头(因此在这个小间隔内向后晃动整个纹理,所以沿着t轴它实际上是正确的)。这是因为OpenGL不知道你的纹理包裹在纹理的中间,因为它在概念上只看到一个大纹理,而不是小纹理的图集,GL_REPEAT包裹模式只能工作在大纹理的边缘。

在访问纹理之前,您必须在片段着色器中进行包装(前两步)。因此,您的纹理坐标都是单调的,并且可以正确插值。然后在片段中,您可以安全地包裹纹理坐标。实际上,您可以在片段着色器中执行所有步骤。只需为地图集内的偏移量选择一个均匀(选择实际的子纹理)。然后在访问纹理之前进行包装,缩放和添加偏移。