有效地为地形物理提供几何
Efficiently providing geometry for terrain physics
我一直在研究游戏引擎中地形系统的不同方法,试图让自己熟悉这项工作。许多细节看起来很简单,但我却被一个细节挂断了。
出于性能原因,许多地形解决方案利用着色器生成部分或全部几何体,例如生成位置的顶点着色器或用于 LoD 的曲面细分着色器。起初我认为这些方法专门用于不关心物理模拟的渲染。
我之所以这么说,是因为就我目前对着色器的了解而言,着色器计算的结果通常会在帧末尾被丢弃。因此,如果您严重依赖着色器,那么几何信息将在您访问它并将其发送到另一个系统(例如 CPU 上的物理 运行)之前消失。
那么,我对着色器的看法是不是错了?您能否存储它们生成的几何图形的结果以供其他系统访问?或者我是否被迫将地形几何体保持在 CPU 上并将着色器留给其他细节?
着色器
您正确理解了部分着色器,即:在一帧之后,数据作为最终合成图像存储在后台缓冲区中。
但是: 使用 变换反馈 可以将变换后的几何图形捕获到顶点缓冲区并重新使用它。变换反馈发生在 vertex/geometry/tessellation 着色器之后,因此您可以使用几何着色器生成地形(或其可见部分 一次),将其推送到变换反馈并存储它。
这样,您就有可能对地形使用 CPU 碰撞检测!您甚至可以将其与曲面细分相结合。
你会喜欢这个:A Framework for Real-Time, Deformable Terrain。
对于LOD和曲面细分:LOD不是曲面细分的先决条件。您可以使用细分来实现一些更复杂的效果,例如通过对粗糙几何体的递归细分来添加细节。将它与 LOD 链接只是一个非常好的优化,避免了基于 RAM 内存的 LOD 网格级别,因为你只有 "base mesh" 并对其进行细分(尽管这将是一个不令人满意的优化恕我直言)。
现在更深入地了解 GPU 和 CPU 专属地形。
GPU 生成的地形(程序)
如 NVidia 文章中所写 Generating Complex Procedural Terrains Using the GPU:
1.2 Marching Cubes and the Density Function Conceptually, the terrain surface can be completely described by a single function, called the
density function. For any point in 3D space (x, y, z), the function
produces a single floating-point value. These values vary over
space—sometimes positive, sometimes negative. If the value is
positive, then that point in space is inside the solid terrain.
If the value is negative, then that point is located in empty space
(such as air or water). The boundary between positive and negative
values—where the density value is zero—is the surface of the terrain.
It is along this surface that we wish to construct a polygonal mesh.
使用着色器
用于生成地形的密度函数必须可用于碰撞检测着色器,并且您必须填充包含碰撞位置的输出缓冲区(如果有)...
CUDA
参见:https://www.youtube.com/watch?v=kYzxf3ugcg0
这里有人根据 NVidia 文章使用了 CUDA,但是这意味着相同:
在CUDA中,进行碰撞检测,必须共享密度函数。
然而,这会使变换反馈技术更难实施。
着色器和 CUDA 都暗示至少一个位置的密度 resampling/recalculation,仅用于单个对象的碰撞检测。
CPU地形
通常,这意味着 RAM 内存以 vertex/index-buffer 对的形式存储了一组几何图形,它们由着色器管道定期处理。由于您拥有此处可用的数据,因此您很可能还会有一个 碰撞网格,它是您执行碰撞的地形的简化表示。
或者你可以在你的地形上设置一组碰撞器,标记允许的路径,恕我直言,早期的PS1最终幻想游戏(实际上不在我们今天理解地形的意义上真正拥有地形)。
这个简短的回答既不广泛也不完整。我只是试图让您深入了解许多解决方案中使用的一些概念。
更多阅读:http://prideout.net/blog/?tag=opengl-transform-feedback.
我一直在研究游戏引擎中地形系统的不同方法,试图让自己熟悉这项工作。许多细节看起来很简单,但我却被一个细节挂断了。
出于性能原因,许多地形解决方案利用着色器生成部分或全部几何体,例如生成位置的顶点着色器或用于 LoD 的曲面细分着色器。起初我认为这些方法专门用于不关心物理模拟的渲染。
我之所以这么说,是因为就我目前对着色器的了解而言,着色器计算的结果通常会在帧末尾被丢弃。因此,如果您严重依赖着色器,那么几何信息将在您访问它并将其发送到另一个系统(例如 CPU 上的物理 运行)之前消失。
那么,我对着色器的看法是不是错了?您能否存储它们生成的几何图形的结果以供其他系统访问?或者我是否被迫将地形几何体保持在 CPU 上并将着色器留给其他细节?
着色器
您正确理解了部分着色器,即:在一帧之后,数据作为最终合成图像存储在后台缓冲区中。
但是: 使用 变换反馈 可以将变换后的几何图形捕获到顶点缓冲区并重新使用它。变换反馈发生在 vertex/geometry/tessellation 着色器之后,因此您可以使用几何着色器生成地形(或其可见部分 一次),将其推送到变换反馈并存储它。 这样,您就有可能对地形使用 CPU 碰撞检测!您甚至可以将其与曲面细分相结合。
你会喜欢这个:A Framework for Real-Time, Deformable Terrain。
对于LOD和曲面细分:LOD不是曲面细分的先决条件。您可以使用细分来实现一些更复杂的效果,例如通过对粗糙几何体的递归细分来添加细节。将它与 LOD 链接只是一个非常好的优化,避免了基于 RAM 内存的 LOD 网格级别,因为你只有 "base mesh" 并对其进行细分(尽管这将是一个不令人满意的优化恕我直言)。
现在更深入地了解 GPU 和 CPU 专属地形。
GPU 生成的地形(程序)
如 NVidia 文章中所写 Generating Complex Procedural Terrains Using the GPU:
1.2 Marching Cubes and the Density Function Conceptually, the terrain surface can be completely described by a single function, called the density function. For any point in 3D space (x, y, z), the function produces a single floating-point value. These values vary over space—sometimes positive, sometimes negative. If the value is positive, then that point in space is inside the solid terrain.
If the value is negative, then that point is located in empty space (such as air or water). The boundary between positive and negative values—where the density value is zero—is the surface of the terrain. It is along this surface that we wish to construct a polygonal mesh.
使用着色器
用于生成地形的密度函数必须可用于碰撞检测着色器,并且您必须填充包含碰撞位置的输出缓冲区(如果有)...
CUDA
参见:https://www.youtube.com/watch?v=kYzxf3ugcg0
这里有人根据 NVidia 文章使用了 CUDA,但是这意味着相同: 在CUDA中,进行碰撞检测,必须共享密度函数。
然而,这会使变换反馈技术更难实施。
着色器和 CUDA 都暗示至少一个位置的密度 resampling/recalculation,仅用于单个对象的碰撞检测。
CPU地形
通常,这意味着 RAM 内存以 vertex/index-buffer 对的形式存储了一组几何图形,它们由着色器管道定期处理。由于您拥有此处可用的数据,因此您很可能还会有一个 碰撞网格,它是您执行碰撞的地形的简化表示。
或者你可以在你的地形上设置一组碰撞器,标记允许的路径,恕我直言,早期的PS1最终幻想游戏(实际上不在我们今天理解地形的意义上真正拥有地形)。
这个简短的回答既不广泛也不完整。我只是试图让您深入了解许多解决方案中使用的一些概念。
更多阅读:http://prideout.net/blog/?tag=opengl-transform-feedback.