在OpenGL 4.0中,增加了着色器细分支持。 在性能方面,基于图元的细分和VAO顶点预加载有什么区别? 所谓的VAO顶点预加载是指将所有顶点数据加载到VAO中,并在保留细分表面于RAM中的同时进行渲染,而不是通过着色器管线动态创建细分表面。
答案是“这取决于情况”。如果你有一堆网格的控制点(Bezier、NURB、Catmull-Clark等),在经典OpenGL中,你需要在CPU上对这些控制点进行细分,并将三角形存储在VAO集合的顶点缓冲区对象中。但是在OpenGL 4中,您可以将控制点传递给VAO,作为GL_PATCHES渲染,并且控制和评估着色器将生成三角形。如果控制点网格是静态的且很少更改,则CPU解决方案更好,因为您只需执行一次细分并存储结果,而不是每帧重新计算完全相同的细分。如果网格发生变化,则GPU解决方案将更好。从CPU复制新的控制点到GPU会更快,因为数据量较小,而且GPU可以并行地进行细分,因此速度更快。GPU端的细分现在可以通过距离(或其他方式)在网格内的单个四边形上更改细节级别,因此您可以使用着色器实现ROAM类型的算法。除非您的GPU已经被复杂的照明和阴影算法等重载,而CPU轻载。在这种情况下,即使细分本身需要更长时间,CPU上进行细分也会提供更好的系统性能。哪种方法适合您?试一试!(还要注意,这可能根本不重要。现代3D系统非常快速。)