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

时间:2012-08-21 08:12:18

标签: opengl

有没有办法阻止着色器编译器删除它检测到的未使用的统一/属性?我偶尔会将我的着色器部分用于测试,但这会导致我的程序其余部分出现问题,因为突然出现某些名称(因此导致查找错误,并在尝试设置值时出错)。

2 个答案:

答案 0 :(得分:4)

不,但这并非严格必要,具体取决于您编写代码的方式。

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

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

  

程序的其余部分需要该属性才能工作,否则它会被一堆if语句所困扰 - 我正试图避免这种情况。

您遇到此问题的唯一原因是您自己没有提供OpenGL属性索引,无论是使用explicit_attrib_location还是使用调用glBindAttribLocation预链接。那是可怕的编码,你不应该这样做。

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

答案 1 :(得分:0)

我通常使用glGetUniformLocation返回的-1来检测错误。所以我认为吞下-1并不是一个好主意。 我找到了解决这个问题的棘手办法。 我将所有统一的varialble加到一个标识符上,并在if(condition)之前将这个统一的和赋值给输出颜色。例如:

if(condition)
{
    outputColor = uniformSum;
}

如果你让conditioin总是假的,比如编码if(val < 0)val总是正数,那么你可以避免编译器优化统一变量。