我正在使用 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 或类似的设置。这是怎么回事?如何使纹理填充给定的顶点?

最佳答案

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

  • 将纹理拉伸(stretch)到最接近的 2 次方。
  • 计算纹理大小与最近的 2 次幂之间的差异,并将纹理坐标从 1.0f 更改为 textureWidth/nearestPowerOfTwoWidthtextureHeight/nearestPowerOfTwoHeight

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

    10-07 19:27
    查看更多