【问题标题】:Texture doesn't stretch properly. Why is this happening?纹理无法正确拉伸。为什么会这样?
【发布时间】:2012-05-12 23:10:49
【问题描述】:

我正在使用 LWJGL 和 Slick 框架将纹理加载到我的 OpenGL 应用程序。

我正在使用这张图片:

以及导入和使用纹理的这段代码:

    flagTexture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("japan.png"));

......

    flagTexture.bind();

    GL11.glColor3f(1.0f, 1.0f, 1.0f);
    GL11.glPushMatrix();

    GL11.glTranslatef(0.0f, 0.0f, -10.0f);

    GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0.0f, 0.0f);
    GL11.glVertex2f(0.0f, 0.0f);
    GL11.glTexCoord2f(1.0f, 0.0f);
    GL11.glVertex2f(2.5f, 0.0f);
    GL11.glTexCoord2f(1.0f, 1.0f);
    GL11.glVertex2f(2.5f, 2.5f);
    GL11.glTexCoord2f(0.0f, 1.0f);
    GL11.glVertex2f(0.0f, 2.5f);
    GL11.glEnd();

    GL11.glPopMatrix();

但最终结果变成了这样:

我没有使用任何特殊设置,例如 GL_REPEAT 或类似的设置。这是怎么回事?如何使纹理填充给定的顶点?

【问题讨论】:

    标签: java opengl graphics textures lwjgl


    【解决方案1】:

    看起来纹理正在填充到最接近的 2 次方。这里有两种解决方案:

    1. 将纹理拉伸到最接近的 2 次方。
    2. 计算纹理大小与最接近的 2 次幂之间的差异,并将纹理坐标从 1.0f 更改为 textureWidth/nearestPowerOfTwoWidthtextureHeight/nearestPowerOfTwoHeight

    可能还有一些特定的 LWJGL 方法允许非二次幂纹理,请查看。

    【讨论】:

    • 哇,解决方案 1 奏效了!非常感谢,我一直在为此苦苦挣扎。你能解释一下为什么这与原来的宽度和高度相反吗?这是一个opengl的东西吗?谢谢。
    • OpenGL 本身从 2.0 开始就支持非二次幂纹理,这是 LWJGL 的事情。从我读到的内容来看,LWJGL 仍然将纹理填充到最接近的 2 次幂(可能是为了支持非常旧的硬件)。使用您上传的图像,您的 600x400 图像变成了 1024x512 纹理。 OpenGL 纹理坐标在 x 和 y 轴上都按 0-1 缩放。纹理坐标 (1, 1) 表示(大约)像素 (1024, 512)。你想要像素 (600, 400),但在 0-1 比例,所以你把它缩小到那个比例:(600/1024, 400/512)
    【解决方案2】:

    如果需要支持非二次幂纹理,可以修改加载方式。如果您使用 Slick2D,除了实现“自己的”纹理类之外别无他法(您可以在此处获得一些示例:Texture.javaTextureLoader.java TextureLoader 类包含一个方法“get2Fold”,它用于计算大于纹理宽度/高度的 2 的下一个幂。因此,如果您想使用非二次方大小的纹理,只需将此方法更改为简单地返回 fold; (=输入),因此程序“认为”下一个二的幂是图像的大小,在很多情况下它不是,但如果硬件支持它(大多数支持),这不应该是个问题。一个更“抽象”的方法是改变这一行: GL11.glTexImage2D(target, 0, dstPixelFormat, get2Fold(bufferedImage.getWidth()), get2Fold(bufferedImage.getHeight()), 0, srcPixelFormat, GL11.GL_UNSIGNED_BYTE, textureBuffer); 这里,第 4 个参数 = 纹理的宽度,第 5 个参数 = 纹理的高度。如果将这些设置为图像的宽度/高度,它将起作用。由于此方法与之前的方法基本相同,因此两者都存在相同的问题。如前所述,这会减慢您的图像处理速度,并且可能不受支持..

    【讨论】:

      【解决方案3】:

      希望这个链接会有所帮助

      http://www.lwjgl.org/wiki/index.php?title=Slick-Util_Library_-_Part_1_-_Loading_Images_for_LWJGL

      看起来和你在这里做的很相似。

      GL11.glBegin(GL11.GL_QUADS);
      GL11.glTexCoord2f(0,0);
      GL11.glVertex2f(100,100);
      GL11.glTexCoord2f(1,0);
      GL11.glVertex2f(100+texture.getTextureWidth(),100);
      GL11.glTexCoord2f(1,1);
      GL11.glVertex2f(100+texture.getTextureWidth(),100+texture.getTextureHeight());
      GL11.glTexCoord2f(0,1);
      GL11.glVertex2f(100,100+texture.getTextureHeight());
      GL11.glEnd();
      

      【讨论】:

      • 这仍然会产生同样的问题,这是纹理坐标的问题,而不是顶点的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多