OpenGL 参考框架

Posted

技术标签:

【中文标题】OpenGL 参考框架【英文标题】:OpenGL Frames of Reference 【发布时间】:2017-05-16 17:23:01 【问题描述】:

最近我一直在尝试渲染大场景,比如行星、太阳系和星系,并且遇到了浮点精度和 z-buffer 精度的著名问题。如here 所述,我使用对数深度缓冲区缓解了 z 缓冲区问题;但是,我还没有弄清楚如何解决大距离的浮动精度限制。

我发现的一种常用方法是对不同的距离使用不同的参考系,例如,对于太阳系来说 1 个单位 = 1 兆米,对于银河系尺度来说,1 个单位 = 1 光年,如 here 和 here 所述。在后一个链接中,有人特别建议

这个想法是,您可以以米为单位对地球进行建模,并将其连接到以千米为单位的太阳系。太阳系又依附于银河系,以光年为模型,银河系与以百万光年为单位的本地星团相连。

当你去渲染场景时,你会向下遍历层次结构,并且在每一层,32 位浮点数都有足够的精度。

我的问题是如何实际实施此方法。当我从不同的单位测量转换时,我是否会缩放每个对象?如何保持使用不同坐标系渲染的对象之间的相对大小和距离?

【问题讨论】:

【参考方案1】:

好的,这是一个有趣的问题,答案可能有点令人惊讶。关键的见解是意识到空间真的很大,而且大多是空的。这意味着空间中的不同物体不会相互接触,您所要做的只是在天空中看到它们的相对位置......然后作弊

所以你要做的是,首先按距离对所有对象进行排序,然后在相同的单位数值范围内绘制所有内容,即整个恒星系统的绘制范围与行星表面的地形相同视点位于。

不作弊,如果你有某种小型的恒星系统模型,银河系,所有这些东西都叠加在一个艺术装置中,整个事情看起来就像这样。一切都会重叠,看起来很奇怪。

这就是“作弊”出现的地方。您将每个比例/距离的大小渲染到一个单独的图层中,然后将它们组合起来,就像 Photoshop 中的图层在所谓的“合成”过程中一样。这种方法的主要问题是正确地在参考框架之间进行转换,以使其不会弹出。

遵循相同方案的技术是3D Skyboxes,本质上是在特定方向渲染几层 3D Skybox 并合成它。

【讨论】:

非常感谢您的回复。只是为了澄清一下,我是否应该将每个比例大小渲染为帧缓冲区或纹理,然后只渲染一个带有结合它们的片段着色器的全屏四边形? @ArcaneEnforcer:是的,使用纹理支持的 FBO 是目前常用的方法。然而另一个同样有效的技术是使用模板缓冲区来标记那些被每一层遮挡的像素,以便那些尚未被遮挡的图像区域被遮盖。然后在渲染一定比例后,清除深度缓冲区(仅深度缓冲区)并渲染下一层。如果场景包含混合几何体,事情就会变得混乱,但通常人们可以忽略混合的东西,而不是主要的量级。

以上是关于OpenGL 参考框架的主要内容,如果未能解决你的问题,请参考以下文章

基于OpenGL编写一个简易的2D渲染框架02——搭建OpenGL环境

什么是富豪 OpenGL? [关闭]

在 OSX 上链接 OpenGL 框架

放大鼠标的算法(OpenGL)

VC基于单文档opengl框架

如何在 C++ builder 中渲染 openGL 框架?