如何在图形硬件管道上执行GLSL着色器程序?

时间:2013-04-18 22:39:04

标签: opengl-es-2.0 glsles

随着我越来越多地使用OpenGL ES 2.0和GLSL,我正在质疑着色器程序在硬件上的执行方式。我理解顶点和片段着色器程序背后的概念就好了,但是关于它们如何在金属上工作仍然非常不清楚。在阅读关于GPU的时候,我经常遇到术语管道,并且GPU具有给定数量的管道。

我理解管道的作用,它提供了一组顶点(表示几何图元)并使用给定参数执行顶点着色器,并通过一些固定功能硬件发送顶点着色器的输出,这些硬件基于这些执行操作输出。顶点着色器还输出在基元的每个片段上插值并输入到片段着色器中的值,从而可以使用通用算法轻松执行大量复杂渲染。

但这是否意味着如果GPU有n个管道,那么在任何给定时刻,n个管道中的每一个都可以执行单个几何图元的着色器程序的实例?

我一直在阅读OpenGL ES 2.0编程指南(根据kindle大约60%),但也许我仍在发展的理解让我错过了这个问题的答案。

我问这个问题的一个实际原因是关于在CPU而不是GPU上应该或不应该做什么工作。例如,如果我正在运行单个更新和渲染线程,那么在CPU上执行矩阵到矢量乘法是否明智,哪些必须在所有对象的行中完成?或者更好的是外包到GPU,其中执行多个几何图元绘制的着色器程序可以在不同的管道上同时完成?

我正在优化一些代码,使用VBO在屏幕上绘制许多四边形,而不是为每个代码单独绘制图形。但由于这被认为是数组渲染,我需要将所有矩阵发送到每个顶点的GPU,即使mvp矩阵对于四边形的每4个顶点是相同的,这可以被认为是带宽上的命中。但是如果着色器程序是同时执行的,而不是在CPU上的渲染线程中一个接一个地执行,也许这是一个值得折衷的权衡。但是,我没有那种专业水平来说这种或那种方式。

1 个答案:

答案 0 :(得分:0)

我会在这里回答我自己的问题,因为我找到了一个针对我正在使用的特定GPU的性能优化文档,即PowerVR SGX架构。该文档在着色器引擎中显示了几个多线程执行单元,因此我假设这是术语管道的含义。也许该术语用于固定功能管道日。任何人都可以随意纠正我。

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