GLSL自动优化

Dra*_*rus 4 opengl shader glsl vertex-shader fragment-shader

我有三个与 GLSL 自动优化(?)过程相关的问题。

  1. 未使用的变量 -> glsl 会删除所有不影响最终片段着色器像素(输出变量)的变量。

  2. 未使用的函数 -> glsl 是否删除了 void main... 之前所有未使用的定义函数?

  3. 那么来龙去脉的变量又如何呢?一个例子:我有 100 个着色器,它们将纹理坐标从顶点着色器发送到片段着色器。在片段着色器中,这些坐标对最终颜色没有影响。glsl 会删除这个变量吗?

Rab*_*d76 5

这没有明确规定。OpenGL 规范说:

请参阅OpenGL 4.6 核心配置文件规范 - 7.6 统一变量 - p. 11。130

7.6 统一变量

着色器可以声明命名的统一变量,如 OpenGL 着色语言规范中所述。如果编译器和链接器确定在执行可执行代码时实际上会访问制服,则制服被视为活动制服。如果编译器和链接器无法做出决定性的决定,则统一将被视为活动的。

请参阅OpenGL 4.6 核心配置文件规范 - 7.3.1 程序接口 - 第 14 页。101

7.3.1 程序接口

当程序对象成为当前渲染状态的一部分时,其可执行代码可以通过各种接口与其他GL管线阶段或应用程序代码进行通信。当程序被链接时,GL 为每个接口构建一个活动资源列表。活动资​​源的示例包括着色器代码使用的变量、接口块和子例程。着色器代码中引用的资源被视为活动的,除非编译器和链接器可以最终确定它们对程序的可执行代码生成的结果没有明显的影响。例如,如果变量已声明但未在可执行代码中使用,则可能会被视为非活动变量、仅在永远不会执行的 if 语句的子句中使用、仅在从未调用的函数中使用或仅在临时计算中使用,则变量可能被视为不活动。对任何着色器输出没有影响的变量。在编译器或链接器无法做出决定性决定的情况下,着色器代码引用的任何资源都将被视为活动的。任何接口的活动资源集都是依赖于实现的,因为它取决于编译器和链接器执行的各种分析和优化。

如果程序链接成功,GL 将根据链接生成的可执行代码生成活动资源列表