Opengl 如何确定我的GLSL编译器是否优化了以下内容?

Opengl 如何确定我的GLSL编译器是否优化了以下内容?,opengl,code-generation,glsl,shader,compiler-optimization,Opengl,Code Generation,Glsl,Shader,Compiler Optimization,我相信GLSL编译器会进行大量优化。我想知道是否有一种方法(可能是通过GL调试上下文或一些扩展?)在将给定GLSL源字符串转换为无法理解的ASM或直接的GPU机器代码之前获得该字符串的“优化版本” 以以下为例: vec3 fx_Noop (const in vec3 vCol) { return vCol; } vec3 fx_Tex2D (const in vec3 vCol) { return fx_Noop(texture(uni_Tex2D, var_Tex2D).rgb

我相信GLSL编译器会进行大量优化。我想知道是否有一种方法(可能是通过GL调试上下文或一些扩展?)在将给定GLSL源字符串转换为无法理解的ASM或直接的GPU机器代码之前获得该字符串的“优化版本”

以以下为例:

vec3 fx_Noop (const in vec3 vCol) {
    return vCol;
}
vec3 fx_Tex2D (const in vec3 vCol) {
    return fx_Noop(texture(uni_Tex2D, var_Tex2D).rgb);
}
在这里,整个fx_Noop()定义和对它的所有调用都应该被删除,但更重要的是,fx_Tex2D()应该这样重写:

vec3 fx_Tex2D () {
    return texture(uni_Tex2D, var_Tex2D).rgb;
}
由于vec3 vCol中的常量未被使用

现在我意识到每个GL驱动程序和GLSL实现的行为都不同。不过,我还是想在汇编/编译/链接之前深入了解驱动程序对给定GLSL源字符串的具体操作


我也意识到GLSL编码器不应该像上面那样编写代码,但在某种实验性的代码生成场景中,当可以安全地进行某些权衡时,事情会简化很多,因为我知道大多数编译器/实现无论如何都会应用良好的清理…

不,如果不分析不同的着色器,就无法以某种方式了解情况。

优化不会在源字符串上发生,但会在以后的步骤中发生,通常是抽象语法树或某些中间代码。好吧,我猜如果能够输出/检查…;)嗯,至少使用基于MesaGL/DRI2/DRM的开源驱动程序,您可以做到这一点。但是没有官方的OpenGL API来获取或设置着色器程序的AST。这将是一个很酷的扩展,允许实现除GLSL之外的其他着色器编程语言(我希望有Lisp或ML等着色器语言)。