有效地为地形物理提供几何图形

Mak*_*rgy 5 c++ terrain game-physics

我现在一直在研究游戏引擎中地形系统的不同方法,试图熟悉这项工作。许多细节看起来很简单,但我对一个细节很感兴趣。

出于性能原因,许多地形解决方案利用着色器来生成部分或全部几何体,例如顶点着色器来生成位置或用于 LoD 的曲面细分着色器。起初我认为这些方法专门用于不关心物理模拟的渲染。

我这么说的原因是因为据我目前对着色器的理解,着色器计算的结果通常会在帧结束时被丢弃。因此,如果您严重依赖着色器,那么在您可以访问几何信息并将其发送到另一个系统(例如在 CPU 上运行的物理系统)之前,几何信息就会消失。

那么,我对着色器的看法是错误的吗?您可以存储它们生成几何图形的结果以供其他系统访问吗?或者我是否被迫将地形几何保留在 CPU 上,而将着色器留给其他细节?

MAB*_*BVT 3

着色器

\n\n

您正确理解了着色器的各个部分,即:在一帧之后,数据将作为最终合成图像存储在后缓冲区中。

\n\n

但是:使用变换反馈,可以将变换后的几何图形捕获到顶点缓冲区中并重用它。变换反馈发生在顶点/几何/曲面细分着色器之后,因此您可以使用几何着色器生成地形(或其可见部分一次),将其通过变换反馈推送并存储它。\n这样,您可能可以使用CPU 与地形的碰撞检测!您甚至可以将其与曲面细分结合起来。

\n\n

您一定会喜欢这个:实时、可变形地形的框架

\n\n

对于LOD和曲面细分:LOD不​​是曲面细分的前提。您可以使用曲面细分来实现一些更复杂的效果,例如通过粗略几何体的递归细分来添加细节。将其与 LOD 链接只是一个非常好的优化,避免基于 RAM 内存的 LOD 网格级别,因为您只有“基础网格”并对其进行细分(尽管这将是一个令人不满意的优化)。

\n\n

现在有一些关于 GPU 和 CPU 专有地形的更深入的信息。

\n\n

GPU 生成地形(程序)

\n\n

正如 NVidia 文章使用 GPU 生成复杂程序地形中所写:

\n\n
\n

1.2 行进立方体和密度函数 从概念上讲,地形表面可以通过单个函数(称为密度函数)完全描述。对于 3D 空间 (x, y, z) 中的任何点,该函数都会生成单个浮点值。这些值在空间\xe2\x80\x94 上变化,有时为正,有时为负。如果该值为正数,则空间中的该点位于实体地形内部。

\n\n

如果该值为负数,则该点位于空白空间\n(例如空气或水)。正值和负值之间的边界\n\n值\xe2\x80\x94(其中密度值为零\xe2\x80\x94)是地形的表面。\n我们希望沿着这个表面构建多边形网格。

\n
\n\n

使用着色器

\n\n

用于生成地形的密度函数必须可用于碰撞检测着色器,并且您必须填充包含碰撞位置(如果有)的输出缓冲区...

\n\n

CUDA

\n\n

请参阅:https://www.youtube.com/watch?v =kYzxf3ugcg0

\n\n

这里有人使用了 CUDA,基于 NVidia 文章,但这意味着相同的:\n在 CUDA 中,执行碰撞检测,必须共享密度函数。

\n\n

然而,这将使变换反馈技术的实施变得更加困难。

\n\n

着色器和 CUDA 都意味着至少在一个位置重新采样/重新计算密度,仅用于单个对象的碰撞检测。

\n\n

CPU地形

\n\n

通常,这意味着 RAM 内存以顶点/索引缓冲区对的形式存储几何图形集,这些几何图形由着色器管道定期处理。当您拥有此处可用的数据时,您也很可能拥有一个碰撞网格,它是您执行碰撞的地形的简化表示。

\n\n

或者,您可以将地形设置为一组碰撞器,标记允许的路径,恕我直言,这是在早期 PS1 最终幻想游戏中执行的(实际上并没有我们今天理解的地形意义上的地形)。

\n\n

这个简短的答案既不深入也不完整。我只是想让您深入了解数十种解决方案中使用的一些概念。

\n\n

更多阅读:http://prideout.net/blog/?tag =opengl-transform-feedback 。

\n