禁用GLSL编译器优化

时间:2014-01-09 09:33:34

标签: opengl glsl

我正在使用带有GLSL 420的OpenGL 4.2。我需要阻止GLSL编译器优化未使用的制服,因为它们可用于偶尔的测试。 我试着说:

#version 420
#pragma optimize (off)
...
......

但它似乎没有效果。编译器仍然清除所有未使用的制服。我正在使用GeForce 680GTX在Linux上运行NVidia驱动程序v319

1 个答案:

答案 0 :(得分:6)

无效统一确定 优化。这是未扩展的GLSL程序如何工作的结果,它们被编译然后链接在一起,并且由于这种实现,确切地知道哪些路径有助于实际的管道输出。有些实现比其他实现更聪明,如果它在片段着色器/转换反馈中没有产生输出,则会消除程序每个阶段的代码路径(包括制服)。

OpenGL 4.4 Core Profile Specification - 7.6统一变量 - 第117页

  

7.6统一变量

     
    

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

  

实现采用这种活动制服定义的程度可以被认为是一种优化......但实际的过程并非如此。我解释了NV的GLSL实施如何有效地进行有效的统一判定here

我提到了未扩展的GLSL程序,因为单独着色器对象确实引发了一些问题。使用该扩展,每个程序可能恰好代表管道的1个阶段,并且无法确定在一个阶段中使用的统一是否实际上对最终输出有影响。按照 活动 统一的正式定义,当使用SSO时,实现必须假定如果在一个阶段中使用它,则它是活动的。

最重要的是,更改优化级别不会改变此行为。