OpenGL 在 3D 空间中渲染 2D

OpenGL Rendering 2D in a 3D space

本文关键字:2D 空间 3D OpenGL      更新时间:2023-10-16

我目前正在做一个项目,作为我课程的一部分,意识到我需要有一个 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 内容
  • 交换缓冲区

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

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