使用 VBO 进行截锥剔除
Posted
技术标签:
【中文标题】使用 VBO 进行截锥剔除【英文标题】:Frustum culling with VBOs 【发布时间】:2013-12-31 10:08:57 【问题描述】:我正计划编写一个将使用 VBO 进行渲染的 3D 游戏。例如,假设地形是一组瓦片,它们的顶点都在同一个 VBO 中。玩家应该能够滚动瓷砖,并且在任何时候都只能看到其中的一部分。
我想对这些图块执行平截头体剔除。我已经找到了一些关于截锥体剔除的数学部分的资料,但我不确定我将如何使用 VBO 来实现这一点——人们是在顶点着色器中以某种方式做到这一点,还是他们只是调用渲染函数来绘制VBO 的一个子集。
【问题讨论】:
你能描述一下你的相机会如何看待你提到的瓷砖吗?是自上而下,第三人称,第一人称,那些瓷砖与相机平行吗?根据这些信息,我可以给你一些关于实施的建议。 相机将是自上而下的,带有倾斜,就像暗黑破坏神系列中的相机一样。观察方向和瓷砖之间的角度约为 45 度。 【参考方案1】:鉴于您的相机表现得像暗黑破坏神(无论是等距还是透视):
如果您有固定的地图大小,则可以使用 1 VBO 作为地图的基本几何图形,假设您将使用基于高度图的解决方案。在顶点着色器之后,您的显卡将丢弃不可见的四边形,这不会影响您的像素填充率。他们不值得在你身边剔除的开销。无论如何,岩石、房屋等细节都会有自己的 VBO。
如果您的目标是具有巨大无缝世界的流媒体内容引擎,请创建块,块的大小取决于您的游戏。将您的地形划分为这些块,并在绘制之前根据它们的边界框测试相机平截头体。
关于绘制块:
对大多数游戏来说已经足够的最简单方法是让每个块都有自己的几何体、VBO 等。但是您可以稍后进行优化,并且您的地形实现不应驱动您的引擎 API 设计(您将必须实现许多不同的方式来在引擎中绘制事物,例如粒子、后期处理效果等。 )。
您可以优化的一种方法是仅使用一个 VBO 用于几何图形和实例绘图的使用,就像在粒子系统中然后您为某些数据获取其他来源一样,例如您的全局变换、每个顶点的高度等等。
但请记住,大多数游戏实际上并不需要仅在地形方面进行太多优化。在你的道路上将会出现其他更值得优化的系统。
【讨论】:
The Quads not visible will be discarded by your graphics card after the vertex shader
仅适用于不面向相机的四边形(背面剔除)还是截锥体之外的四边形也被剔除?另外,我想检查一下这些块——每个块都包含一些图块,并且每个块都分配有一个 VBO。每个块还有一个边界框,用于截头体剔除。我的假设正确吗?
是的,不仅背面的四边形将被丢弃,而且 WHEN 实际上因实现而异,但这是您不应该为优化而烦恼的一件事。是的,你的假设是正确的,但我会在我的回答中详细说明。以上是关于使用 VBO 进行截锥剔除的主要内容,如果未能解决你的问题,请参考以下文章