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;
}
4

1 回答 1

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

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

于 2013-04-05T08:24:20.597 回答