我正在使用 OpenGL 4.2 和 GLSL 420 。我需要防止 GLSL 编译器优化未使用的制服,因为这些制服用于偶尔的测试。
我尝试过:
#version 420
#pragma optimize (off)
...
......
但它似乎没有效果。编译器仍然清除所有未使用的制服。我在Linux上使用GeForce 680GTX运行NVidia驱动程序v319
非活动统一测定是not一个优化。这是未扩展的 GLSL 程序如何工作的结果,它们被编译然后链接在一起,并且由于这种实现,可以准确地知道哪些路径有助于实际的管道输出。某些实现比其他实现更聪明,如果在片段着色器/转换反馈中不产生输出,则将消除程序每个阶段的代码路径(包括统一)。
OpenGL 4.4 核心配置文件规范 http://www.opengl.org/registry/doc/glspec44.core.pdf- 7.6 统一变量 - 第 117 页
7.6 统一变量
着色器可以声明命名的统一变量,如 OpenGL 着色语言规范 中所述。如果编译器和链接器确定在执行可执行代码时实际上会访问制服,则制服被视为活动制服。如果编译器和链接器无法做出决定性的决定,则统一将被视为活动的。
实现对活动制服的定义进行了多远可以被视为优化......但这样做的实际过程并非如此。我解释了 NV 的 GLSL 实现如何有效地进行主动统一确定here https://gamedev.stackexchange.com/questions/68482/glgetuniformlocation-returns-1/68530#68530.
我提到了未扩展的 GLSL 程序,因为单独的着色器对象确实给事情带来了麻烦。使用该扩展,每个程序可以准确地代表管道的 1 个阶段,并且无法确定一个阶段中使用的统一是否实际上对最终输出有影响。按照正式定义active统一,当使用 SSO 时,实现必须假设如果在一个阶段中使用它,那么它是活动的。
最重要的是,改变优化级别不会改变这种行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)