4

我正在使用 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 或类似的设置。这是怎么回事?如何使纹理填充给定的顶点?

4

3 回答 3

9

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

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

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

于 2012-05-12T23:16:15.447 回答
1

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

于 2013-01-03T05:56:24.493 回答
0

希望这个链接会有所帮助

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();
于 2012-05-12T23:15:14.057 回答