OpenGL 着色器阻止优化器删除属性/制服

edA*_*a-y 7 opengl

有什么方法可以防止着色器编译器删除它检测到未使用的统一/属性?我偶尔会注释掉着色器的部分内容以进行测试,但这会导致程序的其余部分出现问题,因为某些名称突然不再存在(从而导致查找错误以及尝试设置值时出现错误)。

Nic*_*las 3

不,但这并不是绝对必要的,具体取决于您编写代码的方式。

这些glUniform*函数很乐意采用统一位置 -1。如果您使用program_pack420和explicit_attrib_location,您可以将属性索引、片段着色器输出、UBO绑定和纹理单元绑定全部放入着色器中。因此,您不必查询活动属性、输出、统一块或采样器。

请注意,我们在 GL 4.3 中也有ARB_explicit_uniform_location。所以你可以在着色器中指定它们,并且它们不会被优化掉。

程序的其余部分需要该属性才能工作,否则它将充斥着一堆 if 语句——我试图避免这种情况。

您遇到这种情况的唯一原因是您自己没有提供 OpenGL 属性索引,无论是使用explicit_attrib_location 还是使用调用glBindAttribLocation预链接。这是糟糕的编码,你不应该这样做。

始终告诉 OpenGL 你的属性位置是什么。除非您正在编写着色器自省工具,否则您永远不应该查询它们。