Java 纹理不';我不能适当地伸展。为什么会这样?

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

我正在使用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或类似的东西。发生什么事了?如何使纹理填充给定的顶点?

希望此链接能有所帮助

看起来很像你在这里做的事情

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)