GLSL编译错误“内存耗尽”

时间:2013-04-05 08:13:41

标签: 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[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 个答案:

答案 0 :(得分:4)

我会在这里走出困境,因为我对着色器语言一无所知。

1。使用逻辑组合(和,或)

但是我知道一般逻辑和许多编程语言。机会很大,如:

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)条件越来越接近结尾。很可能你可以合并发生这种情况的分支。

我建议制作一个真值表(只绘制所有可能的输入)并推导出一个布尔表达式,以便从中生成结果值。