5

我是 GLSL 的新手,正在编写一个小型应用程序,该应用程序将显示 3d 模型并具有一些用户输入来旋转、缩放等。模型相当大(例如 600 万个顶点,1500 万个面)。现在,我正在使用逐顶点着色,并且在我的个人电脑上性能还可以。但我可能需要使用更大的模型(有 10-1500 万个顶点)。

我的问题与每个顶点和每个片段着色之间的性能比较有关。从大量资源以及搜索网络中,我得出结论,每个片段着色具有更好的输出,尤其是对于镜面高光,但是它的性能较低,因为它对多边形的每个像素而不是每个顶点进行计算(与每个顶点着色一样)。

也许我的想法完全错误,但是如果顶点数很大,我是否应该期望每个片段着色运行得更快,例如在我的情况下(6-10 百万个顶点)?每个片段着色的性能是否取决于被绘制到屏幕上的像素数,而每个顶点着色则不是?

4

1 回答 1

6

片段着色的性能取决于在屏幕上绘制的片段数量,包括那些因为某些三角形与其他三角形重叠并发生过度绘制而被绘制两次或更多次的片段。Z 缓冲可以以某种方式减少过度绘制,但并不完美。在相对便宜的 Z 通道期间,延迟(或光预通道)着色可能仍然有过度绘制,但或多或​​少使实际着色部分与屏幕区域严格成比例,而不管某些三角形是否重叠(或其中有多少)。

顶点着色(和后续阶段)的性能主要取决于顶点的数量(如果您有一个几何着色器或曲面细分着色器活动,还有一些其他细节)。通常,现在大多数应用程序都不受顶点处理的限制。几百万个这样的顶点通常不是问题(当然不画看不见的东西总是更好)。
然而,随着三角形变得更小(接近 2x2 片段四边形的大小),更高的顶点数会导致额外的片段着色工作(当然还有组装/光栅化工作和 ROP),而视觉质量没有任何改善,有时甚至由于时间混叠而质量较差。
这与实际处理的顶点数量没有太大关系,而是与单个三角形的屏幕面积变小有关。

因此,您应该有一个 LOD(细节级别)系统,以确保没有太多太小的三角形(例如在远处的要素上),如果这些大型模型是建筑物等,您可以考虑使用门户系统剪掉对可见结果没有贡献的整个几何层次。

于 2013-10-10T10:29:08.380 回答