【问题标题】:LWJGL Confusing Texture MappingsLWJGL 混淆纹理映射
【发布时间】:2013-03-13 09:15:25
【问题描述】:

我一直在制作一个非常简单的游戏,我决定加入一些基本纹理。我正在试验代码,出于某种原因,我不知道为什么,我无法正确映射纹理。现在,我只是想将一个绿色矩形(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 方向上进一步移动,我可以让我的地面纹理处于正确的位置,但是我不希望这样做。我真的不知道纹理最初是如何出现在这个位置的,我想弄清楚为什么。

【问题讨论】:

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

标签: java opengl graphics lwjgl


【解决方案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,但您应该看看如何在众多在线 tutorials 中正确地完成转换。还有 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2012-02-08
    相关资源
    最近更新 更多