我正在尝试使用复杂的if-else决策树实现GLSL片段着色器。不幸的是,着色器编译器很早就出现“语法错误 - 内存耗尽”错误。 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;
}
答案 0 :(得分:4)
我会在这里走出困境,因为我对着色器语言一无所知。
但是我知道一般逻辑和许多编程语言。机会很大,如:
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
而不是&&
,具体取决于特定语言的确切语法。
我注意到至少有两个“子树”完全相同。更具体地,例如,第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)
条件越来越接近结尾。很可能你可以合并发生这种情况的分支。
我建议制作一个真值表(只绘制所有可能的输入)并推导出一个布尔表达式,以便从中生成结果值。