每个顶点着色与大型模型上的每个片段着色

bah*_*hti 5 opengl glsl

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

我的问题与每顶点和每片段着色之间的性能比较有关.从严格的资源,以及搜索网络,我得出结论,每片段阴影具有更好的输出,特别是对于镜面高光,但是它的性能较低,因为它计算多边形的每个像素而不是每个顶点(如在每个顶点着色中).

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

Dam*_*mon 6

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

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

因此,您应该有一个LOD(详细程度)系统,以确保没有太多太小的三角形(例如在远处的特征上),如果这些大型模型是建筑物或类似物,您可能会考虑使用门户系统无论如何都要剪掉几何对可见结果没有贡献的几何体.