1

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

以下是相关代码:

在我创建的 Boot 类中,我调用了这个函数:

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

在我创建的地面类中,我调用了一个绘图函数。纹理在 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 方向上进一步移动,我可以让我的地面纹理处于正确的位置,但是我不希望这样做。我真的不知道纹理最初是如何出现在这个位置的,我想弄清楚为什么。

4

1 回答 1

1

我认为你的矩阵有问题:

    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,但您应该看看在众多在线教程中如何正确完成转换。也在这里

于 2013-03-13T10:57:01.340 回答