首页 > 解决方案 > 顶点和片段是在所有点上运行还是仅在裁剪后剩下的点上运行?

问题描述

我试图围绕 GPU 管道和性能影响...

我创建了一个坐标系并在其上放置了一百万个顶点,它们现在都在 GPU 可用的内存中。我假设这是这一步的性能影响:将所有浮点值移动到 GPU 内存中,暗示已经创建的点。

然后我将我的百万点坐标转换为剪切坐标。在这里,我对每个点都进行了转换。

由于这种转换,一些点现在超出了剪辑坐标,假设只有数千个点在其中。顶点着色器是在千点还是全部百万点上运行?片段着色器呢?还有三角形的构造?转换成最终设备坐标只需要千点?

我的猜测是,顶点仅在可见顶点的插值上运行,但片段除外。

那么唯一可能的优化是首先包含尽可能少的顶点吗?如果我正在查看一个包含建筑物、树木、道路的完整 3D 世界……然后只放大一块岩石,我无论如何都会在所有对象上运行所有着色器……所以唯一的解决方案是不放置首先是那些树木和建筑物?或者我可以在 GPU 内存上拥有这个世界,但只计算岩石?我可以以某种方式将坐标变换应用于岩石吗?GPU 剔除、细节层次或动态曲面细分等技术在流水线中的哪个位置发生?

标签: openglgraphicsmetal

解决方案


顶点着色器为每个提交的顶点glDrawArraysglDrawElements函数族执行,甚至可能每个顶点多次执行。然后将转换后的顶点组装成图元并进行裁剪——如果它在视口之外,那么它们的处理就完成了。为了减少处理视口外对象顶点的开销,采用了多种技术。最简单的一种是“平截头体剔除”——仅当对象的边界框与相机平截头体相交时才提交对象进行渲染。

为通过深度测试的帧缓冲区中的每个片段(“像素”)执行片段着色器。减少它们的计数的一种方法是从前到后渲染——这样就只会计算前面可见的片段。


推荐阅读