纹理不正常伸展。 这究竟是为什么?(Texture doesn't stretch pr

2019-07-29 09:25发布

我使用LWJGL和油滑框架加载纹理到我的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或类似的东西任何特殊设置。 这是怎么回事? 我怎样才能使纹理填充率给定的顶点?

Answer 1:

它看起来像纹理填充越来越出两个最近的电源。 这里有两个解决方案:

  1. 舒展质感出两个最近的电源。
  2. 计算你的纹理的大小和最近的2的幂之间的差异,改变纹理坐标从1.0ftextureWidth/nearestPowerOfTwoWidthtextureHeight/nearestPowerOfTwoHeight

也可能有一些具体的方法LWJGL允许非幂的两个纹理,看个明白。



Answer 2:

如果你需要支持非幂的两个纹理,你可以修改加载方法。 如果你使用Slick2D,有没有办法做到这一点除了实现“自己的”结构类(你可以在这里与一些例子: Texture.java和TextureLoader.java的TextureLoader类包含的方法“get2Fold”,这是用于计算两个比纹理宽度/高度更大的下一个功率所以,如果你想使用非功率的两大小纹理,只是改变该方法简单地折叠返回;(=输入),所以该节目“认为”这两个下一功率是图像,它是不是在很多情况下的大小,但如果硬件支持它(大多数做),这不应该是一个问题。“更抽象”的方式是改变这一行:GL11.glTexImage2D(目标,0,dstPixelFormat,get2Fold(bufferedImage.getWidth()),get2Fold(bufferedImage.getHeight()),0,srcPixelFormat,GL11.GL_UNSIGNED_BYTE,textureBuffer);这里中,第四个参数=质地和第5 =纹理的高度的宽度。如果这些设置对图像的宽度/高度,它会工作。仙 CE这种方法基本上是一样的人之前,有两个同样的问题..正如之前所说,这会减慢你的图像处理,它可能不支持..



Answer 3:

希望这个链接将有一定的帮助

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


文章来源: Texture doesn't stretch properly. Why is this happening?