-3

我想做自己简单的游戏UI,我想我知道主要的东西是怎么做的。问题是我不知道如何通过在 3D 视图中使用屏幕坐标来绘制简单的 2D 四边形?这甚至可能吗?也许我应该以另一种方式绘制游戏 UI?

请不要推荐任何图书馆。我想了解它是如何完成的,而不是使用现有的东西。

4

2 回答 2

2

由于您包含了 lwjgl 标记,因此通常在 OpenGL 中通常是这样完成的,这对您来说也应该可以正常工作:

  1. 像往常一样渲染你的底层游戏场景
  2. 设置视图,以便您拥有可以在场景顶部渲染的正交视图。它的单位范围从 -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);
    
  3. 使用 -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)。但这不推荐。

于 2012-05-17T21:01:52.167 回答
1

使用 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 类...

于 2012-05-17T20:58:49.500 回答