我使用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这样的任何特殊设置。这是怎么回事?如何使纹理填充给定的顶点?
答案 0 :(得分:9)
看起来纹理被填充到最接近的2的幂。这里有两种解决方案:
1.0f
更改为textureWidth/nearestPowerOfTwoWidth
和textureHeight/nearestPowerOfTwoHeight
。可能还有一些特定的LWJGL方法允许非二次幂纹理,请查看。
答案 1 :(得分:1)
如果需要支持非二次幂纹理,可以修改加载方法。如果你使用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的宽度/高度,它将起作用。由于此方法与之前的方法基本相同,因此两者都存在相同的问题。如前所述,这会降低图像处理速度,并且可能不支持..
答案 2 :(得分: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();