【问题标题】:LWJGL Texture not stretching to QuadsLWJGL 纹理不拉伸到四边形
【发布时间】:2023-08-15 08:53:01
【问题描述】:

我已经尝试了几个小时在 LWJGL 中将纹理拉伸到四边形。

这是我用于四边形的代码:

private static void renderLoad() {
    glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

    texture.bind();

    glPushMatrix();{
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0, 1);
        glVertex2f(0, 0); //Upper-left

        glTexCoord2f(1, 1);
        glVertex2f(Display.getWidth(), 0); //Upper-right

        glTexCoord2f(1, 0);
        glVertex2f(Display.getWidth(), Display.getHeight()); //Bottom-right

        glTexCoord2f(0, 0);
        glVertex2f(0, Display.getHeight()); //Bottom-left
    }
    glEnd();
    }glPopMatrix();
}

这是我运行它时的显示效果: http://gyazo.com/376ddb0979c55226d2f63c26215a1e12

我正在尝试使图像扩展到窗口的大小。 Quad 是窗口大小,但纹理似乎没有拉伸。

如果我不使用纹理并且简单地将四边形设为颜色,则如下所示: http://gyazo.com/65f21fe3efa2d3948de69b55d5c85424

如果有帮助,这里是我的主循环:

glMatrixMode(GL_PROJECTION);
        glViewport(0, 0, displaySizeX, displaySizeY);
        glLoadIdentity();
        glOrtho(0, displaySizeX, 0, displaySizeY, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        glEnable(GL_TEXTURE_2D);

        texture = loadLoadingImage();

        //This is the main loop for the game.
        while(!Display.isCloseRequested()){
            delta = getDelta();
            updateFPS();
            if(Display.wasResized()){
                displaySizeX = Display.getWidth();
                displaySizeY = Display.getHeight();
                glViewport(0, 0, displaySizeX, displaySizeY);
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                glOrtho(0, displaySizeX, 0, displaySizeY, -1, 1);
            }
            render();
            checkInput();
            Display.update();
            Display.sync(sync);
        }

        cleanUp();
        return true;

如何使图像拉伸到四边形?

【问题讨论】:

  • 您没有在显示调整大小代码中将矩阵模式设置回GL_MODELVIEW。不确定这是否是导致问题的原因。
  • 我尝试修复并删除它,但它什么也没做。即使不改变显示,它仍然不会拉伸图像。
  • 你用什么来加载纹理?看起来它可能是在加载时将纹理大小四舍五入到二的下一个幂的工具包之一。
  • @RetoKoradi 我正在使用 slick-utitls。无论如何我解决了这个问题。这是图像。我在某处读到图像/纹理必须能够除以 2,并且它必须是 2 的指数。我将图像大小更改为 1024,现在效果很好!
  • 这实际上只是您用于加载图像的库的限制。 OpenGL 纹理大小必须为 2 的幂的限制很久以前就被取消了。

标签: java opengl 2d lwjgl


【解决方案1】:
public void stretch() {
        Color.white.bind();
        texture.bind

        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+character.getTextureHeight());
        GL11.glTexCoord2f(0,1);
        GL11.glVertex2f(100,100+texture.getTextureHeight());

        GL11.glEnd(); // all the 0's were originally 100 but it was off centered
    }

texture = TextureLoader.getTexture("PNG",ResourceLoader.getResourceAsStream("res/texture.png"));

尝试使用它。我通常是这样做的。

【讨论】:

  • 好吧,那没用。图像现在是颠倒的,是一个镜像。它也没有伸展。
  • 好吧。您将需要通过在线工具或应用程序将图像放大并使其足够大以容纳您的屏幕。例如,如果屏幕为 800 x 600,则将图像设置为 800+600,或者您也可以直接转到显示 texture.getTextureWidth() 的位置并将其更改为 texture.getTextureWidth() + differenceneeded
【解决方案2】:

也许有些东西正在修改纹理矩阵。您可以尝试添加一个

glMatrixMode(GL_TEXTURE);
glLoadIdentity();

看看这是否会影响任何事情。

【讨论】:

  • 我把它改成了那个,它仍然没有伸展。难道是我用的是JPG?
最近更新 更多