OpenGL 在 3D 空间中渲染 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 测试等
- 将活动矩阵模式设置为投影
- 加载标识并建立透视投影
- 将活动矩阵模式设置回模型视图
- 绘制所有 3D 内容
- 二 维和:
- 禁用照明、Z 测试等
- 将活动矩阵模式设置为投影
- 加载恒等式并建立方位投影
- 将活动矩阵模式设置回模型视图
- 绘制所有 2D 内容
- 交换缓冲区
使用透视矩阵更新了代码,现在可以正确显示。
在矩阵之间添加透视矩阵解决了这个问题,现在一切都可以正常显示。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 2D数组来自文本输入,中间有空格
- 命名空间中具有.h和.cpp文件的类
- 将值指定给向量(2D)的向量中的某个位置
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 在命名空间中定义函数还是限定函数
- 如何使用用户输入在C++中正确填充2D数组
- C++:对不存在的命名空间使用命名空间指令
- 如何在C++中检查2D数组中负值的输入验证
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- OpenGL相机和相机空间转型的困惑
- CUDA内核和数学函数的显式命名空间
- 打印第二列时的2d字符矢量打印空间
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- 将每个对象渲染到空间中,并在3D场景上渲染2D场景
- 在OpenGL 2.1中,即使在2D空间(具有2D纹理),也可以安全使用3D TEX坐标
- OpenGL 在 3D 空间中渲染 2D