c++ - OpenGL 渲染不同的对象

标签 c++ opengl glm-math

我在渲染我的太阳系时遇到了一些问题。

我有小物体和大物体,大物体的距离是小物体的 10e9 倍。我如何渲染所有这些? (当我围绕我的小物体时,我想看到太阳)

glm::perspective(m_fInitialFoV, 4.0f / 3.0f, near, far);

如果远/近太大,所有物体都在闪烁。

最佳答案

最好的方法是按比例对对象进行分组并分别渲染它们。例如,太阳系可以使用地球的尺度作为单位,即半径为 6378.1 km,距离太阳的距离为 147.09x10^6 km

围绕地球半径对这些进行归一化,我们得到:

Earth's Radius: 1.0 unit
Distance from sun: 23061.72 units

相同的归一化原则适用于其他太阳系天体:

Venus' Radius: 0.9488405638 units
Distance from sun: 16851.41 units

Pluto's Radius: 0.186105580 units
Distance from sun: 695633.4 units

您还应该设置深度以包含这些数字。只要物体之间有很大的空间,就不会出现错误和 z 冲突。 所以:

  1. 首先渲染“大”组。 (大深度范围)
  2. 然后只清除屏幕的深度。
  3. 然后渲染小的和靠近相机的物体,比如小行星、宇宙飞船等。不需要那么大的东西 数字。 (这里使用小得多的深度范围)
  4. 大功告成。

如您所见,您可以根据比例和多个级别对场景进行分组。例如,您可以获取本地恒星群的坐标列表,首先将它们渲染为点,清除深度,然后渲染您所在系统的主体,再次清除深度,并渲染本地对象你的职位。您还应该考虑到,从地球上几乎看不到像冥王星这样的行星,因此您可以简单地使用更小的深度范围进行绘制。

关于c++ - OpenGL 渲染不同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35700648/

相关文章:

c++ - 在 C++ 中使用在 masm 中编译的 lib

c++ - 如何将指向结构的指针传递给构造函数?

c++ - AMD GPU 在 OpenGL 3.3 中可以绘制的顶点数是否有最大限制?

c++ - 将 3D 变换转换为 2D

c++ - Qt:如何为 QLabel 创建清晰可见的发光效果? (例如使用 QGraphicsDropShadowEffect)

c++ - 我在 unix 中编译代码时遇到编译器错误

c - 将带有 glut 的点击坐标添加到 vector 链接列表中

c++ - glm lookAt 和矩阵变换产生奇怪的行为

c++ - 从 OBB 的模型矩阵中提取 3x3 旋转矩阵

c++ - OpenGL:程序渲染纯白色正方形而不是变换后的正方形