【问题标题】:OpenGL Rendering 2D in a 3D spaceOpenGL 在 3D 空间中渲染 2D
【发布时间】:2015-01-27 13:02:15
【问题描述】:

我目前正在做一个项目,作为我课程的一部分,我意识到我需要一个 HUD 来向用户显示信息,偶然发现 glOrtho 并一直在尝试使用它,但是在渲染时遇到了一些问题目前是 2D 点,但不是背景中的所有 3D 对象。 为绘制 2D 和 3D 制作了不同的函数,因此主绘制函数不那么混乱。

void draw3D
{
   glEnable(GL_DEPTH_TEST);

  GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

  GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};
  GLfloat lightPos[] = {-2 * floorSize, floorSize, 4 * floorSize, 1.0f};
  glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
  glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(60.0, (float)resizeWindowW/(float)resizeWindowH, 1.0, 50000000000.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity(); 
  glTranslatef(0.0f, 0.0f, -9.0f);      

  Cam.setView();

  glColor3f(1.0f, 1.0f, 1.0f);

  oldRocket();
  drawEarth();
}

.

void draw2D()
{
  glDisable(GL_DEPTH_TEST);
  glDisable(GL_CULL_FACE);
  glDisable(GL_TEXTURE_2D);
  //glDisable(GL_LIGHTING);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-windowW/2, windowW/2, -windowH/2, windowH/2, -1000.0, 1000.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  drawCrosshair();
}

.

void drawScene() 
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  draw3D();
  draw2D(); 

  //glDisable(GL_CULL_FACE);
  glDisable(GL_TEXTURE_2D); 
  glutSwapBuffers();
}

目前它正在绘制的只是屏幕中间的黑色背景点,并且一直试图让它正确绘制一段时间,但没有结果。 遵循这种方法,因为它可以像以前一样呈现黑屏。

  • 清洁屏幕
  • 3D:
    • 启用照明、z 测试等
    • 将有源矩阵模式设置为投影
    • 加载身份并建立透视投影
    • 将有源矩阵模式设置回模型视图
    • 3D 绘制所有内容
  • 二维:
    • 禁用照明、z 测试等
    • 将有源矩阵模式设置为投影
    • 加载身份并建立正交投影
    • 将有源矩阵模式设置回模型视图
    • 2D 绘制所有内容
  • 交换缓冲区

使用透视矩阵更新了代码,现在可以正确显示。

【问题讨论】:

  • 你忘了问问题。
  • 已修复,感谢指出。
  • 在 draw2D() 中禁用深度测试。根据您的代码,在下一个 draw3D() 中它是否仍然被禁用?您可能必须在 draw3D() 中启用它。此外, glOrtho() 参数可能必须是 -w/2,+w/2,-h/2,+h/2,...;所以世界原点位于视口的中心。
  • 启用深度测试并将坐标更改为中心屏幕,但没有做任何事情。
  • 到目前为止,您的模型视图矩阵从未在粘贴的代码中正确设置。看起来您只是在帧之间(以及 2D 和 3D 绘图之间)累积转换。另外,drawScene() 中的那个流浪的 glEnd() 看起来让我很不安。

标签: c++ opengl 3d 2d orthographic


【解决方案1】:

在矩阵之间添加透视矩阵解决了这个问题,现在一切都正常显示了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多