OpenGL渲染不同的对象
Posted
技术标签:
【中文标题】OpenGL渲染不同的对象【英文标题】:OpenGL rendering different objects 【发布时间】:2016-02-29 13:20:35 【问题描述】:我在渲染我的太阳系时遇到了一些问题。
我有小物体和一个大物体,它的距离是小物体的 10e9 倍。我怎样才能渲染所有这些? (当我在我的小物体周围时,我想看到太阳)
glm::perspective(m_fInitialFoV, 4.0f / 3.0f, near, far);
如果 far/near 太大,则所有对象都在闪烁。
【问题讨论】:
图形计算中不能使用天文距离; double 的精度不足以处理它们。 细化@ColonelThirtyTwo: 写道:在进行天文渲染时,通常归结为假设所有物体都在无穷远处并且只关注角度方向。 如果下一个选项是可能的?:如果主体太远,则以可见的方式在相机对象的半径矢量上传输和缩放对象。如果相机移动了,投影也移动了。 【参考方案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-fighting。 所以:
-
首先渲染“大”组。 (深度范围大)
然后只清除屏幕的深度。
然后渲染小而靠近相机的物体,比如小行星、宇宙飞船等,不需要那么大的东西
数字。 (这里使用的深度范围要小得多)
大功告成。
如您所见,您可以根据规模和多个级别对场景进行分组。例如,您可以获取本地恒星组的坐标列表,首先将它们渲染为点,清除深度,然后渲染您所在的系统的主体,再次清除深度,然后渲染位于您现在的位置。您还应该考虑到,像冥王星这样的行星从地球上几乎看不到,因此您可以简单地使用更小的深度范围进行绘图。
【讨论】:
【参考方案2】:比多通道渲染更简单的解决方案是使用对数深度缓冲区。以一定的精度为代价,您可以成倍地扩展可用深度范围。在这里查看更多信息:http://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html
【讨论】:
以上是关于OpenGL渲染不同的对象的主要内容,如果未能解决你的问题,请参考以下文章