我正在建造一个微型城市,它具有城市的基本外观(道路、建筑物、树木等),您可以在其中四处走动。我知道在每一帧中渲染整个模型集不起作用......
那么任何人都可以让我深入了解用于选择性地仅呈现系统可见部分的标准(但最简单)程序吗?我的意思是,只显示可见的东西(相对于相机位置)而不呈现不可见的部分。我使用 VC++ 和 GLUT API。
也许这篇维基百科文章提供了剔除技术领域的非常基本的介绍。
视锥体剔除是一个很好的起点,也是最简单的技术之一。使用此方法,您可以检查场景中的每个对象是否位于查看体积(查看视锥体)内。这基本上相当于检查几何体的一些简化边界体积(例如完全包含几何体的盒子或球体),如果它位于由六个平面定义的视锥体内。
这可以通过按位置对对象进行分组并创建所谓的包围体层次结构来进一步优化,例如,您可以首先检查整个城市街区是否位于查看体内部(通过使用包含整个街区的包围体),然后如果是的话,你再进一步检查个别房子。
一种更复杂的技术是遮挡剔除,这意味着检查一个对象是否完全隐藏在另一个对象后面。因为这些技术可能变得更加复杂,所以实际上应该(如果完成)在视锥体剔除之后完成。OpenGL 具有硬件遮挡查询,可以帮助您确定对象是否实际上可见,但它们需要一些额外的工作才能正常工作。特别是对于城市来说,可能会有特殊的二维遮挡剔除技术(很早以前就听说过,不知道)。
这只是一个非常广泛的概述,请随意使用谷歌搜索各个关键字。如果额外的 CPU 开销值得的话(特别是使用复杂的遮挡剔除技术),仔细权衡总是一个好主意,考虑到现在的趋势是将尽可能多的几何体批处理到单个绘制调用中(顺便说一句,我希望你不要使用立即模式glBegin/glEnd
,否则将其更改为顶点数组或更好的 VBO 是你议程上的第一点)。但视锥体剔除可能是一个很好且简单的起点,特别是当城市变得相当大时。