2

我正在使用一个纹理图集,它是通过将 2 个相同大小的图像并排拼接在一起制作的。当我修改纹理坐标时,我按以下顺序执行以下操作:

  1. if(texCoordx>1) texCoordx = texCoordx % 1- 所以一种纹理不会泄漏到另一种纹理中。
  2. if(texCoordx<0) texCoordx = 1 + texCoordx- 同样,所以一种纹理不会泄漏到另一种纹理中。
  3. 将纹理坐标缩放 0.5。
  4. 如果要在右侧绘制纹理,则添加 0.5。

这工作得很好,但是,我似乎在纹理坐标接近 1 和 0的边缘处“弄脏”了。看起来它沿着t轴被弄脏了。我附上了截图。

图像在边框处弄脏

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

4

1 回答 1

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包裹模式仅适用于边缘大纹理。

在访问纹理之前,您必须在片段着色器中进行包装(前两个步骤)。所以你的纹理坐标都是单调的并且得到正确的插值。然后在片段处,您可以安全地包装纹理坐标。实际上,您可以在片段着色器中完成所有步骤。只需给它一个统一的图集中偏移量(选择实际的子纹理)。然后在访问纹理之前进行包装、缩放和添加偏移量。

于 2011-08-04T17:46:42.827 回答