2

随着我越来越多地玩弄 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 上的渲染线程上一个接一个地执行,也许这是一个值得权衡的选择。但是我没有那种水平的专业知识可以说一种或另一种方式。

4

1 回答 1

0

我将在这里尝试回答我自己的问题,因为我找到了我正在使用的特定 GPU 的性能优化文档,即 PowerVR SGX 架构。该文档显示了着色器引擎内的几个多线程执行单元,所以我假设这就是术语管道的含义。也许这个术语在固定功能管道时代使用过。任何人都可以请随时纠正我。

关于我如何优化我的代码,我认为这是非常标准的做法,每个四边形由相同的主顶点表示,这些顶点根据对象的状态进行转换。对象维护一组矩阵,这些矩阵表示它们所经历的所有转换。发送到 GL 时,使用对象维护的矩阵转换主要顶点,并将 ise 顶点发送到顶点着色器。将 VP 矩阵作为统一发送,因为它是全局独立的。我现在看到无论如何都没有将矩阵作为属性发送到 GL 的方法,我想是由于带宽问题。

于 2013-04-19T17:04:08.483 回答