Java LWJGL混淆纹理映射
我一直在做一个非常简单的游戏,我决定加入一些基本的纹理。我正在试验代码,出于某种原因,我不知道为什么,我无法正确地映射纹理。现在,我只是尝试将一个绿色矩形(512 x 64.png文件)映射到640 x 480大小屏幕的底部。这个绿色矩形应该代表地面。以下是我失败尝试的图像: 以下是相关代码: 在我创建的引导类中,我调用此函数: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
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高,所以这当然应该是右上角。接下来显示的两个顶点显然是窗口的左下角和右下角。