GLSL 编译错误"memory exhausted"



我试图实现一个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)条件向终点移动。你很有可能将发生这种情况的分支组合在一起。

与其手动执行此(艰苦的)过程,我建议制作一个真值表(仅绘制出所有可能的输入)并推导单个布尔表达式以从中生成结果值。

相关内容

最新更新