OpenGL - 选择性世界渲染

时间:2011-11-02 17:06:27

标签: opengl glut

我正在建造一个微型城市,其中有一个城市的基本最小外观(道路,建筑物,树木等),你可以四处走动。我知道在每个帧中渲染整个模型集都不起作用......

那么,任何人都可以让我深入了解有选择地只渲染系统可见部分的标准(但最简单)程序吗?我的意思是,只显示可见的东西(相对于相机位置)而不显示看不见的部分.. 我正在使用VC ++和GLUT API。

2 个答案:

答案 0 :(得分:3)

也许this Wikipedia article提供了对剔除技术领域的基本介绍。

一个很好的起点,最简单的技术之一就是视锥体剔除。使用此方法,您可以检查场景中的每个对象(如果它位于查看体积内)(查看视锥体)。这基本上等于检查几何体的一些简化边界体积(如框或球体,完全包含几何体),如果它位于由六个平面定义的视锥体内。

通过按对象位置对对象进行分组并创建所谓的边界卷层次结构,可以进一步优化这一点,例如,首先检查一个整个城市街区是否在观察区内(通过使用包含整个区块的边界体积),并且只有在它的情况下,您还要检查各个房屋。

更复杂的技术是遮挡剔除,这意味着检查对象是否完全隐藏在另一个对象后面。因为这些技术可以变得更加复杂,所以应该(如果完成的话)实际上在视锥体剔除之后进行。 OpenGL具有硬件遮挡查询,可以帮助您确定对象是否实际可见,但它们需要一些额外的工作才能正常工作。特别是对于城市,可能会有特殊的二维遮挡剔除技术(很久以前我听说过,不知道)。

这只是一个非常广泛的概述,随时可以谷歌搜索个别关键字。如果额外的CPU开销是值得的,那么仔细权衡总是一个好主意(特别是使用复杂的遮挡剔除技术),考虑到现在趋势是将尽可能多的几何体批量化为单个绘制调用(顺便说一下,我希望你不要使用立即模式glBegin/glEnd,否则将其更改为顶点数组或更好的VBO是你议程上的第一点)。但是观看视锥体剔除可能是一个很好而且容易的起点,特别是如果城市变得相当大的话。

答案 1 :(得分:0)

Google“二进制空间分区树”。

BSP树是确定从相机的视角和位置渲染的内容的好方法。老派的第一人称射击游戏,即Quake et al ,使用它们(或者至少是原理的一些推导)。

这是一个很好的FAQ

其他好资源: link link