有什么方法可以防止着色器编译器删除它检测为未使用的统一/属性?我偶尔会注释掉我的着色器的一部分进行测试,但这会导致我程序的其余部分出现问题,因为突然某些名称不再存在(从而导致查找错误,并在尝试设置值时出错)。
2 回答
不,但这不是绝对必要的,具体取决于您编写代码的方式。
这些glUniform*
函数将很高兴地采用统一的 -1 位置。如果您使用的是 program_pack420 和 explicit_attrib_location,您可以将属性索引、片段着色器输出、UBO 绑定和纹理单元绑定都放在着色器中。因此,您不必查询活动属性、输出、统一块或采样器。
请注意,我们在 GL 4.3 中也有ARB_explicit_uniform_location 。所以你可以在着色器中指定它们,它们不会被优化掉。
程序的其余部分需要该属性才能工作,否则它会被一堆 if 语句乱扔——我试图避免这种情况。
遇到这种情况的唯一原因是,如果您没有自己提供 OpenGL 属性索引,无论是使用 explicit_attrib_location 还是使用glBindAttribLocation
预链接调用。那是糟糕的编码,你不应该那样做。
总是告诉 OpenGL 你的属性位置是什么。除非您正在编写着色器内省工具,否则您永远不应该查询它们。
我通常使用返回的 -1glGetUniformLocation
来检测错误。所以我认为吞下-1不是一个好主意。我找到了一个棘手的解决方案来解决这个问题。我将所有统一变量加到一个标识符中,并将这个统一总和分配给 a 之前的输出颜色if(condition)
。例如:
if(condition)
{
outputColor = uniformSum;
}
而如果你让conditioin
总是为假的,比如编码if(val < 0)
而val
总是为正的,那么你可以避免编译器优化掉统一变量。