我是GLSL的新手并编写了一个小型应用程序,它将显示一个3D模型,并有一些用户输入来旋转,缩放等。模型相当大(例如600万个顶点,1500万个面)。现在,我正在使用每个顶点着色,我的个人电脑上的性能还可以。但我可能需要使用更大的模型(具有10-15百万个顶点)。
我遇到的问题与每顶点和每片段着色之间的性能比较有关。从严格的资源,以及搜索网络,我得出的结论是,每片段着色具有更好的输出,特别是对于镜面高光,但是它的性能较低,因为它计算多边形的每个像素而不是每个顶点(如在每个顶点着色中)。
也许我认为完全错了,但如果顶点数量很大,我应该期望每个片段着色运行得更快,例如在我的情况下(6-10百万个顶点)?每个片段着色的性能取决于绘制到屏幕的像素数,而每个顶点着色不是?
答案 0 :(得分:6)
片段着色的性能取决于在屏幕上绘制的片段数量,包括那些经常被绘制两次或更多次的片段,因为某些三角形与其他三角形重叠并发生过度绘制。 Z缓冲可以某种方式减少透支,但不完美。在相对便宜的Z通道期间,延迟(或轻度预通过)着色可能仍然具有过度绘制,但是或多或少会使实际着色部分与屏幕区域严格成比例,而不管某些三角形是否重叠(或者如何其中很多都在那里。)
顶点着色(以及后续阶段)的性能主要取决于顶点的数量(如果您有几何着色器或tesselation着色器处于活动状态,则还有一些其他细节)。通常,大多数应用程序现在不受顶点处理的限制。数百万个顶点就像这样通常不是问题(虽然当然不能画出看不见的东西总是更好)。
然而,随着三角形变小(接近2x2片段四边形的大小),较高的顶点数会导致额外的片段着色工作(当然还有装配/光栅化工作和ROP)作为次要效果而没有任何改善的视觉质量有时甚至由于时间混叠而质量较差
这与处理的顶点的实际数量没有多大关系,而是与各个三角形的屏幕区域变小。
因此,您应该有一个LOD(详细程度)系统,以确保没有太多太小的三角形(例如在远处的特征上),如果这些大型模型是建筑物等,您可能会考虑门户网站系统可以剪掉几乎不会对可见结果做出贡献的几何体的几何层次结构。