【问题标题】:GLSL auto optimizationGLSL 自动优化
【发布时间】:2018-06-15 19:54:02
【问题描述】:

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

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

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

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

【问题讨论】:

  • 着色器编译器是特定于实现的,规范倾向于留下这样模糊的细节,以允许实现追求任何最有效的策略。我认为答案是: 1. 几乎肯定 2. 几乎肯定。 3. 可能。

标签: opengl glsl shader fragment-shader vertex-shader


【解决方案1】:

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

OpenGL 4.6 Core Profile Specification - 7.6 Uniform Variables - p. 130:

7.6 统一变量

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

OpenGL 4.6 Core Profile Specification - 7.3.1 Program Interfaces - p. 101:

7.3.1 程序接口

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多