渲染我的太阳系时遇到了一些问题。
我有一些小物体和一个大物体,它的位置比小物体大10e9倍。我怎么能渲染这一切? (当我在我的小物体周围时,我希望看到太阳)
glm::perspective(m_fInitialFoV, 4.0f / 3.0f, near, far);
如果远/近是大的,所有物体都会闪烁。
答案 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 :(得分:0)
比多次渲染更简单的解决方案是使用对数深度缓冲区。以某种精度为代价,您可以指数级地扩展可用深度范围。请点击此处了解更多信息:http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html