2011-11-02 50 views
4

我正在建设一个微缩城市,以便可以在其中移动的城市(道路,建筑物,树木等)的基本最小外观。我知道在每一帧中渲染整个模型是行不通的...OpenGL - 选择性世界渲染

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

+0

有很多方法可以做到这一点。 Frustrum剔除(只绘制视图端口中的内容),遮挡剔除(只绘制不完全遮蔽的东西),但仅列出两个。也有部分渲染技术是你开始绘制,然后停止,当你达到这个帧的阈值时间。 – ChrisF

+0

谢谢你@christian ..我将检查那些...... OpenGl是否提供了预定义的函数来帮助这些方法?或者我们是否应该从头开始实施算法? – itsraining

+0

自从我活跃于3D图形之后,我已经有一段时间了,所以我并没有完全掌握最新的知识,但是很大程度上取决于您决定发送流水线的方式。 – ChrisF

回答

3

也许this Wikipedia article提供了一个非常基本介绍剔除技术领域。

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

这可以通过按对象的位置对对象进行分组来进一步优化,并创建所谓的边界卷层次结构。首先检查整个城市街区是否在观看体积内(通过使用包含整个街区的边界体积),并且只有这样才会进一步检查个别房屋。

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

这只是一个非常宽泛的概述,随意谷歌个别关键字。考虑到现在的趋势是将尽可能多的几何体分批到一次绘制调用(顺便说一下,如果额外的CPU开销是值得的(尤其是对于复杂的遮挡剔除技术),仔细加权总是一个好主意,我希望你不要使用即时模式glBegin/glEnd,否则将它改为顶点阵列或更好的VBO是你议程上的第一点)。但是,查看截锥体可能是一个不错的和容易的出发点,特别是如果城市变得相当大。

0

谷歌“二元空间分区树”。

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

这是一个很好的FAQ

其他好的资源: link link

+0

对多边形进行分区的经典BSP树是现今时代的“尽可能多地将批处理调成单个绘图调用”优化的图形硬件的完全不起作用。并且不要让文件以“.bsp”结尾,这会欺骗你,它与BSP树有关(可能在最远的意义上)。如果需要,这些文件应该以“.pvs”结尾。 –

+0

谢谢你们帮忙和提供链接..我想我现在会去看看截锥体..如果我能处理这些东西,我可能会选择闭塞剔除。:) – itsraining