让我们想象一个大的网格,就像我们可能用于地形的网格一样。我们将n
在一次绘制调用中渲染值得的三角形,覆盖我们1080p屏幕的一半。
如果我们焊接所有顶点并且没有平滑/纹理接缝,则每个三角形都有3个顶点,并且每个顶点由6个三角形共享,因此我们有n/2
顶点。
要渲染此图像,我们需要:
至少运行顶点着色器n/2
几次
(“至少”,因为我们用于顶点结果的缓存非常大。有时,我们最终将逐出已经变换的顶点,然后再次需要它以共享它的以后的三角形,然后在其上重新运行顶点着色器。因此,我们所得到的节省并没有纸张上的那么多)
剪辑和剔除n
三角形。
光栅化和插值至少1920x1080 / 2或大约100万像素的帧缓冲区(因为我们说过我们的地形大约覆盖了一半的屏幕)。
(“至少”是因为GPU在四像素像素上工作的方式,多边形边缘之外的一些片段仍会被光栅化,然后被遮罩,这意味着我们对片段进行了两次处理。遮挡自身,如果我们不足够幸运地首先将最前面的多边形绘制到深度缓冲区中)
对所有> = 1百万个片段运行片段着色器。
将约一百万个结果混合到帧和深度缓冲区中。
好的,现在让我们解开所有顶点,以便现在3n
可以渲染顶点,比以前增加了六倍!我们的步骤是...
...等等,除第一步外,其他所有步骤都是一样的!因此,GPU在典型的绘制调用中所做的大部分工作都与所使用的顶点数没有直接关系。屏幕覆盖率,透支和三角形总数构成了更多的成本。
这并不意味着顶点是完全自由的。如果可以共享顶点,则可以从缓存中获得一些适度的节省,尤其是在顶点着色器复杂或硬件的顶点管线较弱的情况下(例如某些较旧的控制台)。但是,鉴于顶点数跟踪与三角形数成正比或减去一个常数因子成正比,因此通常不像总网格成本那样令人感兴趣。