【问题标题】:Shader tessellation vs Algorithmic tessellation着色器细分与算法细分
【发布时间】:2012-07-05 11:58:46
【问题描述】:

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

【问题讨论】:

  • 给出的任何答案都将是特定于平台和实现的。 “vao 顶点预加载”是什么意思?

标签: opengl


【解决方案1】:

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

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

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

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

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

你是谁?试试看!

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

【讨论】:

  • 我倾向于说,曲面细分对于变化的几何图形主要是一种优势的假设是错误的。 Tesselation 允许在您需要的地方提供细节,并防止在您不需要和不想要细节的距离内出现许多微小(1-2 个碎片或更小)的三角形。它还用 ALU 换取带宽。 ALU 丰富且不断增加,而带宽有限且仅缓慢增加。就目前而言,曲面细分几乎在各个方面都是双赢的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多