2

在 OpenGL 4.0 中,添加了着色器细分支持。就性能而言,每个原始细分和 vao 顶点预加载有什么区别?通过 vao 顶点预加载,我的意思是在 vao 中加载所有顶点数据并渲染它,同时将细分曲面保留在 RAM 中,而不是通过着色器管道动态创建细分曲面。

4

1 回答 1

5

答案是非常肯定的“视情况而定”。

好的,你有一堆网格控制点(Bezier、NURB、Catmull-Clark,...)。在经典的 OpenGL 中,您将在 CPU 上细分控制点并将三角形存储在顶点缓冲区对象的 VAO 集合中。使用 OpenGL 4,您可以在 VAO 中传递控制点,渲染为 GL_PATCHES,并让控制和评估着色器生成三角形。

如果控制点的网格是静态的并且很少更改,那么 CPU 解决方案会更好,因为您只需进行一次细分并存储结果,而不是每帧重新计算完全相同的细分。

如果网格发生变化,那么 GPU 解决方案会更好。将新的控制点从 CPU 复制到 GPU 会更快,因为数据更少,而且 GPU 可以并行细分,因此速度会更快。GPU 端细分现在可以通过距离(或其他)在网格中的各个四边形处更改细节级别,因此您可以使用着色器实现 ROAM 类型的算法。

除非你的 GPU 已经负载很重,比如复杂的光照和阴影算法,而 CPU 负载很轻。在这种情况下,在 CPU 上进行曲面细分可以提供更好的整体系统性能,即使曲面细分本身需要更长的时间。

你是哪个?试试看!

(也请注意,这可能根本不重要。现代 3D 系统速度非常快。)

于 2012-07-05T03:58:46.990 回答