【问题标题】:OpenGL - Texture Atlas "smudging"OpenGL - 纹理图集“涂抹”
【发布时间】:2011-10-20 05:07:28
【问题描述】:

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

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

这效果很好,但是,我似乎在纹理 s 坐标接近 1 和 0 的边缘处出现“污迹”。看起来它正在沿 t 轴。我附上了截图。

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

【问题讨论】:

  • 你在哪里执行 1 和 2 ?它是在您的着色器中还是在您的程序中?
  • 我应该如何解读你的图片?这是地图集纹理之一吗?从左到右的原始 texcoords 是什么(只有 s 似乎相关)?可能类似于 (0, 1, 2) 以及 4 步转换后的 texCoords 是什么?
  • @neodelphi - 我在我的程序中执行它,着色器不会修改纹理坐标 Christian - 你解释它的方式是正确的,你在下面给出的答案很可能是什么继续。非常感谢!

标签: opengl texturing


【解决方案1】:

如果我正确解释了您的图片,则此纹理是图集中的两个纹理之一(假设为左侧),而您的原始 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 包裹模式仅适用于大纹理的边缘。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    相关资源
    最近更新 更多