OpenGL着色器阻止优化器删除属性/一致性

OpenGL着色器阻止优化器删除属性/一致性,opengl,Opengl,是否有任何方法可以防止着色器编译器删除其检测为未使用的统一/属性?我偶尔会注释掉着色器的一部分以进行测试,但这会在程序的其余部分造成问题,因为突然某些名称不再存在(从而导致查找错误,以及在尝试设置值时出错)。没有,但这不是严格必要的,具体取决于您编写代码的方式 glUniform*函数的统一位置为-1。如果您使用的是program_pack420和explicit_attrib_location,则可以将属性索引、片段着色器输出、UBO绑定和纹理单元绑定都放在着色器中。因此,您不必查询活动属性、

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

没有,但这不是严格必要的,具体取决于您编写代码的方式

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

请注意,我们在GL 4.3中也有。因此,您可以在着色器中指定它们,而不会对它们进行优化

程序的其余部分需要该属性才能工作,否则它将被一堆if语句所乱丢——我正试图避免这些语句

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


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

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

if(condition)
{
    outputColor = uniformSum;
}

如果你让
conditionin
始终为假,比如编码
if(val<0)
val
始终为正,那么你可以避免编译器优化均匀变量。

我认为你做不到。相反,您可能应该向调用程序添加逻辑,在尝试访问它们之前检查uniform/属性是否存在。这正是导致问题的逻辑。程序的其余部分需要该属性才能工作,否则它会被一堆我试图避免的
if
语句弄得乱七八糟。@edA-qamort-ora-y好吧,获取不存在的制服的位置应该只返回-1,用-1调用
glUniform
不会有任何伤害,除非生成GL错误,但谁在乎呢?它需要相当高的OpenGL版本。@Bartek:不。OpenGL 2.1实现中提供了program_pack420和explicit_attrib_location。他们在那里工作得很好。NVIDIA公开了他们仍然支持的2.1级硬件。简言之,如果你能为它找到合理的最新驱动程序,那么它们就会在那里。@edA-qamort-ora-y是的,对于制服来说这并不重要,因为调用
glUniform(-1,…)
(如
glGetUniformLocation
返回
-1
(如果不存在的话)是不可行的。@BartekBanachewicz,即使
显式属性位置不存在,您仍然有
glBindAttribLocation
,它始终受支持,并且有效地执行相同的操作(尽管在应用程序中而不是着色器中)。对于制服来说,这并不重要,正如Nicol已经解释的那样。@BartekBanachewicz如果硬件/驱动程序有一个扩展(甚至是核心扩展),你可以使用它。仅仅因为这些功能仅包含在GL 3+的核心版本中,并不意味着在完全支持它们的情况下,在GL 2中使用它们时,您正在输入未定义的行为或黑魔法(而且您在非nVidia硬件上也不使用桌面GL)。这段代码应该放在主要功能的末尾。