纹理不能正确拉伸。 为什么会这样?

我正在使用LWJGL和Slick框架将Textures加载到我的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或类似的东西。 这是怎么回事? 如何使纹理填充给定的顶点?

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

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

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

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

希望这个链接会有所帮助

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();