Java LWJGL混淆纹理映射

Java LWJGL混淆纹理映射,java,opengl,graphics,lwjgl,Java,Opengl,Graphics,Lwjgl,我一直在做一个非常简单的游戏,我决定加入一些基本的纹理。我正在试验代码,出于某种原因,我不知道为什么,我无法正确地映射纹理。现在,我只是尝试将一个绿色矩形(512 x 64.png文件)映射到640 x 480大小屏幕的底部。这个绿色矩形应该代表地面。以下是我失败尝试的图像: 以下是相关代码: 在我创建的引导类中,我调用此函数: public void initGL() { GL11.glMatrixMode(GL11.GL_PROJECTION); G

我一直在做一个非常简单的游戏,我决定加入一些基本的纹理。我正在试验代码,出于某种原因,我不知道为什么,我无法正确地映射纹理。现在,我只是尝试将一个绿色矩形(512 x 64.png文件)映射到640 x 480大小屏幕的底部。这个绿色矩形应该代表地面。以下是我失败尝试的图像:

以下是相关代码:

在我创建的引导类中,我调用此函数:

    public void initGL() {
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, gameWidth, gameHeight, 0, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
    }
在我创建的基类中,我调用了一个draw函数。纹理加载到Boot类中,并设置为受保护的变量,我将其绑定并在ground.draw()函数中使用

    public void draw() {
        this.texture.bind();
        GL11.glLoadIdentity();
        GL11.glTranslatef(0, 0, 0);
        GL11.glBegin(GL11.GL_QUADS);
            GL11.glTexCoord2f(0, 0);
            GL11.glVertex2f(0, 480 - height);
            GL11.glTexCoord2f(1, 0);
            GL11.glVertex2f(640, 480 - height);
            GL11.glTexCoord2f(1, 1);
            GL11.glVertex2f(640, 480);
            GL11.glTexCoord2f(0, 1);
            GL11.glVertex2f(0, 480);
        GL11.glEnd();
   }   

另外,如果您注意到上面的内容,我有一个GL11.glTranslatef调用。我可以得到我的地面纹理在正确的位置,如果我只是使这个函数的第二个参数足够大,使它在y方向上进一步位移,但我不希望这样做。我真的不知道纹理最初是如何出现在这个位置的,我想找出原因

我认为你的矩阵有问题:

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, gameWidth, gameHeight, 0, 1, -1);
我从来没有真正使用过OpenGL固定管道,但我看到或实际上没有看到的是矩阵相乘的地方。必须将四边形的模型矩阵与投影矩阵(glOrtho())相乘。(glPushMatrix/glPopMatrix)

因此,在您的场景中,您应该:

Push Ortho matrix.
   Push camera(view) matrix (if exists).
        Push Model Matrix.

        Pop  Model Matrix.
   Pop camera (view) matrix (if exists).
Pop Ortho matrix.
如果Ortho从未改变,我想你只需要推一次。 还要确保考虑正交坐标的变化,因为根据glOrtho()设置,世界中心将不同于屏幕中心。通常为左上角或左下角


底线是:虽然我不建议您使用旧的和不推荐使用的OpenGL,但您应该看看如何在众多的在线应用程序中以正确的方式进行转换。此外,我认为您的矩阵存在问题:

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, gameWidth, gameHeight, 0, 1, -1);
我从来没有真正使用过OpenGL固定管道,但我看到或实际上没有看到的是矩阵相乘的地方。必须将四边形的模型矩阵与投影矩阵相乘,投影矩阵为glOrtho()。(glPushMatrix/glPopMatrix)

因此,在您的场景中,您应该:

Push Ortho matrix.
   Push camera(view) matrix (if exists).
        Push Model Matrix.

        Pop  Model Matrix.
   Pop camera (view) matrix (if exists).
Pop Ortho matrix.
如果Ortho从未改变,我想你只需要推一次。 还要确保考虑正交坐标的变化,因为根据glOrtho()设置,世界中心将不同于屏幕中心。通常为左上角或左下角


底线是:虽然我不建议您使用旧的和不推荐使用的OpenGL,你应该看看如何在众多的在线视频中正确地进行转换。还有

那么问题是什么?绿色的四边形不是有你为四边形顶点指定的大小吗?问题是上面显示的第二块代码中的顶点应该(我想)映射到窗口最底部的区域。左上角点为0(480-高度),其中高度是纹理的高度。下一个是640480高,所以这当然应该是右上角。接下来显示的两个顶点显然是窗口的左下角和右下角。那么问题是什么?绿色的四边形不是有您为四边形顶点指定的大小吗?问题是上面显示的第二块代码中的顶点应该(我认为)映射到窗口最底部的一个区域。左上角点为0(480-高度),其中高度是纹理的高度。下一个是640480高,所以这当然应该是右上角。接下来显示的两个顶点显然是窗口的左下角和右下角。