Java 纹理不';我不能适当地伸展。为什么会这样?
我正在使用LWJGL和Slick框架将纹理加载到我的OpenGL应用程序中 我正在使用此图像: 此代码用于导入和利用纹理:Java 纹理不';我不能适当地伸展。为什么会这样?,java,opengl,graphics,textures,lwjgl,Java,Opengl,Graphics,Textures,Lwjgl,我正在使用LWJGL和Slick框架将纹理加载到我的OpenGL应用程序中 我正在使用此图像: 此代码用于导入和利用纹理: flagTexture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("japan.png")); flagTexture.bind(); GL11.glColor3f(1.0f, 1.0f, 1.0f); GL11.glPushMatrix()
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或类似的东西。发生什么事了?如何使纹理填充给定的顶点?希望此链接能有所帮助 看起来很像你在这里做的事情
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();
看起来纹理正在被填充到最接近的二次方。这里有两种解决方案:
1.0f
更改为textureWidth/nearestPowerOfTwoWidth
和texturehight/nearestpoweroftwowehight
可能还有一些特定的LWJGL方法允许两个纹理的非幂次,请仔细研究。如果需要支持两个纹理的非幂次,可以修改加载方法。如果您使用Slick2D,除了实现“自己的”纹理类之外,没有其他方法可以做到这一点(您可以在这里获得一些关于这些的示例:和 TextureLoader类包含一个方法“get2Fold”,该方法用于计算大于纹理宽度/高度的下一个二次幂。因此,如果要使用非二次幂大小的纹理,只需将此方法更改为仅返回fold;(=输入),以便程序“思考”下一个二次方是图像的大小,在很多情况下不是这样,但是如果硬件支持(大多数支持),这应该不是问题。更“抽象”的方法是更改这一行: GL11.glTexImage2D(目标,0,dstPixelFormat,get2Fold(bufferedImage.getWidth()),get2Fold(bufferedImage.getHeight()),0,srcPixelFormat,GL11.GL_无符号字节,textureBuffer);
这里,第4个参数=纹理的宽度,第5个参数=纹理的高度。如果将这些参数设置为图像的宽度/高度,则会起作用。由于此方法与之前的方法基本相同,因此这两种方法都存在相同的问题。如前所述,这将降低图像处理速度,并且可能不受支持。我仍然会产生同样的问题,这是纹理坐标的问题,而不是顶点的问题。哇,解决方案1成功了!非常感谢,我一直在努力解决这个问题。你能解释一下为什么与原始的宽度和高度相比,这是一个opengl的东西吗?谢谢。opengl本身支持两个纹理的非幂函数,自2.0以来,这是一个LWJGL的东西。据我所知,LWJGL仍然将纹理增加到最接近的二次方(可能支持真正的旧硬件)。通过您上传的图像,您的600x400图像成为1024x512纹理。OpenGL纹理坐标在x轴和y轴上的比例均为0-1。纹理坐标(1,1)表示(近似)像素(1024512)。您需要像素(600400),但是在0-1的比例中,所以您可以将其缩小到该比例:(600/1024400/512)