OpenGL渲染不同的对象

时间:2016-02-29 13:20:36

标签: c++ opengl glm-math

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

我有一些小物体和一个大物体,它的位置比小物体大10e9倍。我怎么能渲染这一切? (当我在我的小物体周围时,我希望看到太阳)

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

如果远/近是大的,所有物体都会闪烁。

2 个答案:

答案 0 :(得分:1)

最好的方法是按比例对对象进行分组并分别渲染它们。例如,太阳系可以使用地球的尺度,即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. 你已经完成了。
  5. 如您所见,您可以根据比例和多个级别对场景进行分组。例如,您可以获取本地恒星组的坐标列表,首先将它们渲染为点,清除深度,然后渲染您所进入的系统的主体,再次清除深度,并渲染本地对象您现在的位置。你还应该考虑,冥王星这样的行星几乎从地球上看不到,所以你可以简单地使用更小的深度范围进行绘制。

答案 1 :(得分:0)

比多次渲染更简单的解决方案是使用对数深度缓冲区。以某种精度为代价,您可以指数级地扩展可用深度范围。请点击此处了解更多信息:http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html