我试图实现一个GLSL片段着色器与一个复杂的if-else决策树。不幸的是,着色器编译器很早就失败了,出现了"语法错误-内存耗尽"错误。在GLSL中对代码大小或决策树深度有任何限制吗?有什么建议来解决这个问题吗?
bool block1(float p[16], float cb, float c_b) {
if(p[6] > cb)
if(p[7] > cb)
if(p[8] > cb)
return true;
else
if(p[15] > cb)
return true;
else
return false;
else if(p[7] < c_b)
if(p[14] > cb)
if(p[15] > cb)
return true;
else
return false;
else if(p[14] < c_b)
if(p[8] < c_b)
if(p[9] < c_b)
if(p[10] < c_b)
if(p[11] < c_b)
if(p[12] < c_b)
if(p[13] < c_b)
if(p[15] < c_b)
return true;
else
return false; // ';' : syntax error memory exhausted
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
if(p[14] > cb)
if(p[15] > cb)
return true;
else
return false;
else
return false;
else if(p[6] < c_b)
if(p[15] > cb)
if(p[13] > cb)
if(p[14] > cb)
return true;
else
return false;
else if(p[13] < c_b)
if(p[7] < c_b)
if(p[8] < c_b)
if(p[9] < c_b)
if(p[10] < c_b)
if(p[11] < c_b)
if(p[12] < c_b)
if(p[14] < c_b)
return true;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
if(p[7] < c_b)
if(p[8] < c_b)
if(p[9] < c_b)
if(p[10] < c_b)
if(p[11] < c_b)
if(p[12] < c_b)
if(p[13] < c_b)
if(p[14] < c_b)
return true;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
if(p[13] > cb)
if(p[14] > cb)
if(p[15] > cb)
return true;
else
return false;
else
return false;
else if(p[13] < c_b)
if(p[7] < c_b)
if(p[8] < c_b)
if(p[9] < c_b)
if(p[10] < c_b)
if(p[11] < c_b)
if(p[12] < c_b)
if(p[14] < c_b)
if(p[15] < c_b)
return true;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
}
我将在这里冒险,因为我对着色器语言一无所知。
1。使用逻辑组合(and, or)
但是我知道一般逻辑和许多编程语言。很有可能像
这样的结构if(p[8] < c_b)
if(p[9] < c_b)
if(p[10] < c_b)
if(p[11] < c_b)
if(p[12] < c_b)
if(p[13] < c_b)
if(p[15] < c_b)
return true;
else
return false; // ';' : syntax error memory exhausted
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
else
return false;
可以简单地表示为以下(单个)布尔表达式:
return (p[8] < c_b)
&& (p[9] < c_b)
&& (p[10] < c_b)
&& (p[11] < c_b)
&& (p[12] < c_b)
&& (p[13] < c_b)
&& (p[15] < c_b);
您可能必须使用and
而不是&&
,这取决于特定语言的确切语法。
2。消除冗余
我注意到至少有两个"子树"是完全相同的。更具体地说,例如第57行(这里为方便而进行格式压缩):
if(p[13] < c_b) if(p[7] < c_b) if(p[8] < c_b) if(p[9] < c_b) if(p[10] < c_b) if(p[11] < c_b) if(p[12] < c_b) if(p[14] < c_b)
return true;
else return false; else return false; else return false; else return false; else return false; else return false; else return false; else return false;
与第83行
完全相同 if(p[7] < c_b) if(p[8] < c_b) if(p[9] < c_b) if(p[10] < c_b) if(p[11] < c_b) if(p[12] < c_b) if(p[13] < c_b) if(p[14] < c_b)
return true;
else return false; else return false; else return false; else return false; else return false; else return false; else return false; else
仅随(p[13] < c_b)
条件向终点移动。你很有可能将发生这种情况的分支组合在一起。
与其手动执行此(艰苦的)过程,我建议制作一个真值表(仅绘制出所有可能的输入)并推导单个布尔表达式以从中生成结果值。