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

时间:2012-05-12 23:10:49

标签: java opengl graphics textures lwjgl

我使用LWJGL和Slick框架将纹理加载到我的OpenGL应用程序。

我使用此图片:Japanese flag, using for texture

此代码用于导入和利用纹理:

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

但最终结果变为: Texture not stretching to the vertex-parameters

我没有使用像GL_REPEAT这样的任何特殊设置。这是怎么回事?如何使纹理填充给定的顶点?

3 个答案:

答案 0 :(得分:9)

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

  1. 将纹理拉伸至最接近的2的幂。
  2. 计算纹理大小与最接近2的幂之间的差异,并将纹理坐标从1.0f更改为textureWidth/nearestPowerOfTwoWidthtextureHeight/nearestPowerOfTwoHeight
  3. 可能还有一些特定的LWJGL方法允许非二次幂纹理,请查看。

答案 1 :(得分:1)

如果需要支持非二次幂纹理,可以修改加载方法。如果你使用Slick2D,除了实现你自己的纹理类之外别无他法(你可以在这里得到一些例子:Texture.javaTextureLoader.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();