繁体   English   中英

在3D空间中进行OpenGL渲染2D

[英]OpenGL Rendering 2D in a 3D space

目前,我正在做一个项目,这是我的课程工作的一部分,意识到我需要一个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测试等
    • 将活动矩阵模式设置为投影
    • 加载身份并建立透视投影
    • 将活动矩阵模式设置回modelview
    • 绘制一切3D
  • 2D:
    • 禁用照明,z测试等
    • 将活动矩阵模式设置为投影
    • 加载身份并建立正交投影
    • 将活动矩阵模式设置回modelview
    • 绘制所有二维
  • 交换缓冲区

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

在矩阵之间添加透视图矩阵可以解决此问题,并且所有内容现在都可以正确显示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM