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渲染不同的对象的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 opengl 中从 2 个不同的线程渲染 2 个不同的帧缓冲区对象?

如何在 OpenGL 3.2+ 中渲染多个形状和对象?

使用 OpenGL 和顶点数组对象渲染两个对象

C++ OpenGL渲染两个不同颜色的矩形

glDrawElement 的 OpenGL 渲染问题

一个主 OpenGL 程序中的多个着色器