有没有办法防止着色器编译器删除被检测为未使用的uniform/attribute? 我有时会注释掉我的着色器的某些部分进行测试,但这会在程序的其他部分中引起问题,因为突然某些名称不存在(从而导致查找错误和设置值时出错)。
glUniform(-1, ...)
(由于glGetUniformLocation
返回-1表示不存在)是一个无操作。 - Christian Rauexplicit_attrib_location
,您仍然可以使用glBindAttribLocation
,它始终受支持并且实际上执行相同的操作(尽管在应用程序中而不是着色器中)。对于uniform变量,无论如何都没有关系,就像Nicol已经解释过的那样。@BartekBanachewicz - Christian RauglGetUniformLocation
返回的 -1 来检测错误。因此,我认为仅仅忽略 -1 并不是一个好主意。
但是,我找到了解决这个问题的一个巧妙方法。
我将所有的 uniform 变量相加,赋值给输出颜色之前的一个标识符,并在 if(condition)
语句中使用它。例如:if(condition)
{
outputColor = uniformSum;
}
如果你让条件
始终为假,例如编写if(val < 0)
而val
始终为正值,则可以避免编译器优化均匀变量。
if
语句 - 而我正试图避免这种情况。 - edA-qa mort-ora-yglUniform
不会有任何损害,除了可能会生成一个GL错误外,谁在乎呢? - Christian Rau