我确信 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中的 const 没有被使用。
现在我意识到每个 GL 驱动程序和 GLSL 实现的行为都不同。我仍然想深入了解驱动程序在汇编/编译/链接之前对给定的 GLSL 源字符串究竟做了什么。
我也意识到 GLSL 编码器不应该编写像上面这样的代码,但是在一个有点实验性的代码生成场景中,当可以安全地做出某些权衡时,事情会得到很多简化,因为知道大多数编译器/实现都会应用一个很好的清理反正...