Memory GLSL编译错误“;“内存耗尽”;

Memory GLSL编译错误“;“内存耗尽”;,memory,compiler-errors,glsl,shader,Memory,Compiler Errors,Glsl,Shader,我正在尝试用复杂的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[1

我正在尝试用复杂的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;
}
bool block1(float p[16],float cb,float c_b){
if(p[6]>cb)
if(p[7]>cb)
if(p[8]>cb)
返回true;
其他的
if(p[15]>cb)
返回true;
其他的
返回false;
else if(p[7]cb)
if(p[15]>cb)
返回true;
其他的
返回false;
else if(p[14]cb)
if(p[15]>cb)
返回true;
其他的
返回false;
其他的
返回false;
else if(p[6]cb)
if(p[13]>cb)
if(p[14]>cb)
返回true;
其他的
返回false;
else if(p[13]cb)
if(p[14]>cb)
if(p[15]>cb)
返回true;
其他的
返回false;
其他的
返回false;
else if(p[13]
我将在这里冒险,因为我对着色器语言一无所知

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;
与第83行完全相同

if(p[7]
就在
(p[13]
的情况接近尾声时。很可能您可以合并发生这种情况的分支


我建议创建一个真值表(只需映射出所有可能的输入)并推导一个布尔表达式,从中生成结果值,而不是手动执行这个(费劲的)过程。

我将在这里讨论一个问题,因为我对着色器语言一无所知

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;
与第83行完全相同

if(p[7]
就在
(p[13]
的情况接近尾声时。很可能您可以合并发生这种情况的分支


我建议创建一个真值表(只需映射出所有可能的输入)并推导一个布尔表达式,从中生成结果值,而不是手动执行这个(费劲的)过程。

“着色器编译器很早就崩溃了,出现了一个“语法错误-内存耗尽”错误”是否有错误,还是会崩溃?崩溃和编译器错误不是一回事。当然,谢谢你的改进。因此,编译器会因为这个错误而失败。一般来说,当您用几乎任何语言编写了第五个嵌套的
if
语句时,您应该停下来问一个非常简单的问题:“有没有更好的方法来完成我正在尝试的任务?”除非您已经用尽了所有其他选项,否则不要继续编写该语句。否则,请解释这段代码应该做什么,这样其他人就可以找到一种不涉及几十个嵌套的
if
语句的方法。实际上,这是一个布尔函数,有16个输入,域为3个可能的有效值(因为我可以将p数组的每个元素映射到[0;c_b]、[c_b;cb]中的一个),[cb;inf)区间)。也就是说,函数有3^16 p
    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;
   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