我想做自己简单的游戏UI,我想我知道主要的东西是怎么做的。问题是我不知道如何通过在 3D 视图中使用屏幕坐标来绘制简单的 2D 四边形?这甚至可能吗?也许我应该以另一种方式绘制游戏 UI?
请不要推荐任何图书馆。我想了解它是如何完成的,而不是使用现有的东西。
由于您包含了 lwjgl 标记,因此通常在 OpenGL 中通常是这样完成的,这对您来说也应该可以正常工作:
设置视图,以便您拥有可以在场景顶部渲染的正交视图。它的单位范围从 -1.0f、-1.0f(屏幕左侧、顶部)到 1.0f、1.0f(屏幕底部、右侧),并将绘制在您已经渲染的游戏场景的顶部下方。
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
使用 -1.0f 到 1.0f 的坐标渲染纹理四边形
glBegin(GL_QUADS);
// <== Bind your texture, material for your GUI button here
glVertex3f(-0.5, 0.5, 0);
glVertex3f(0.5, 0.5, 0);
glVertex3f(0.5, -0.5, 0);
glVertex3f(-0.5, -0.5, 0);
glEnd();
这为您提供了分辨率独立性。因此,如果您在 800x600 上玩游戏,四边形将是一种尺寸,但如果您在 1024x768 上玩游戏,它会自动增长以填充屏幕的相同比例区域。
如果你真的想直接在屏幕坐标中写入,那么你可以设置你的 glOrtho 代替(例如范围从 0.0 到 800.0)。但这不推荐。
使用 GLU.gluOrtho2D(0f, glutScreenWidth, 0f, glutScreenHeight); 将投影设置为正交;
这就是 JBullet 为文本绘制设置投影的方式(它们使用 1 作为 FontRenderer 中的 z 坐标):
// See http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho
public void setOrthographicProjection() {
// switch to projection mode
gl.glMatrixMode(GL_PROJECTION);
// save previous matrix which contains the
// settings for the perspective projection
gl.glPushMatrix();
// reset matrix
gl.glLoadIdentity();
// set a 2D orthographic projection
gl.gluOrtho2D(0f, glutScreenWidth, 0f, glutScreenHeight);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
// invert the y axis, down is positive
gl.glScalef(1f, -1f, 1f);
// mover the origin from the bottom left corner
// to the upper left corner
gl.glTranslatef(0f, -glutScreenHeight, 0f);
}
请参阅https://github.com/affogato/JBullet-QIntBio-Fork/blob/master/src/com/bulletphysics/demos/opengl/并查看 FontRenderer 和 LwjglGL 类...