随着我越来越多地玩弄 OpenGL ES 2.0 和 GLSL,我开始质疑着色器程序是如何在硬件上执行的。我很好地理解了顶点和片段着色器程序背后的概念,但是关于它们如何在金属上工作仍然很不清楚。在阅读有关 GPU 的信息时,我经常遇到术语管道,并且 GPU 具有给定数量的管道。
我了解管道的作用,它提供一组顶点(表示几何图元)并使用给定参数执行顶点着色器,并通过一些基于这些输出执行操作的固定功能硬件发送顶点着色器的输出。顶点着色器还输出在图元的每个片段上插值的值并输入到片段着色器中,从而使用通用算法轻松执行大量复杂的渲染。
但这是否意味着如果 GPU 有 n 条管道,那么在任何给定时刻,n 条管道中的每一条都可以执行单个几何图元的着色器程序的实例?
我一直在阅读 OpenGL ES 2.0 编程指南(根据 kindle 大约读了 60%),但也许我仍在不断发展的理解导致我错过了这个问题的答案。
我问这个问题的一个实际原因是关于应该或不应该在 CPU 而不是 GPU 上完成哪些工作。例如,如果我正在操作单个更新和渲染线程,那么在 CPU 上执行矩阵到矢量乘法是否明智,它必须在所有对象的一行中完成?或者将执行多个几何图元绘制的着色器程序外包给 GPU 会更好吗?
我正在优化一些代码,以使用 VBO 在屏幕上绘制许多四边形,而不是为每个四边形单独绘制调用。但由于这被认为是数组渲染,我需要将每个顶点的所有矩阵发送到 GPU,即使四边形的每 4 个顶点的 mvp 矩阵都是相同的,这可以被认为是对带宽的影响。但是,如果着色器程序是同时执行的,而不是在我的 CPU 上的渲染线程上一个接一个地执行,也许这是一个值得权衡的选择。但是我没有那种水平的专业知识可以说一种或另一种方式。