禁止在GLSL中递归?

问题描述:

你好我是GLSL的新手,在尝试写下面的递归调用时遇到了这个错误。我已经看到了GLSL中递归光线追踪实现的很多演示,所以我假定GLSL支持递归。

这是不是这种情况?禁止在GLSL中递归?

的OpenGL函数返回一个编译时错误消息:

Error: Function trace(vec3, vec3, vec3, int) has static recursion 

这是我的函数定义

vec3 trace(vec3 origin, vec3 direction, vec3 illum, int order) 
{  
    float dist; 
    int s_index = getSphereIntersect(origin, direction, dist); 
    //if light hit 
    float light_dist = 200; 
    for(int k = 0; k < L_COUNT;k++)  
     if(s_intersects(l_center[k], l_radius[k], 
      origin, direction, 
      light_dist)) 
      if(light_dist < dist)    
       return l_color[k]; //light is pure color 

    if (s_index != -1) 
    { 
     illum = s_color[s_index]; 
     for(int j = 0; j < L_COUNT; j++) 
     { 
      float ambient = 0.68; 
      float diffuse = 0.5; 
      vec3 poi = view + (direction * dist); 
      vec3 li_disp = normalize(poi - l_center[j]); 
      vec3 poi_norm = s_normal(s_center[s_index], s_radius[s_index], poi); 
      float shade= dot(li_disp, normalize(poi_norm)); 
      if(shade < 0) shade = 0; 
      illum = illum*l_color[j]*ambient + diffuse * shade; 
      //test shadow ray onto objects, if shadow then 0  
      if(order > 0) 
        illum = trace(poi+.0001*poi_norm, poi_norm, illum, order-1); 
     } 
    } 
    else 
     illum = vec3(0,0,0); 
    return illum; 
} 
+2

如果你知道你的递归的最大深度可以用一个循环替换它和阵列充当堆叠 –

+0

@MrD没错的在这里小例子[反射和折射不可能没有递归光线追踪?](https://stackoverflow.com/a/45140313/2521214) – Spektre

我认为GLSL支持递归

号GLSL没有支持或更好的表示允许递归函数调用。

GLSL没有。 GLSL内存模型不允许递归函数调用。这允许GLSL在简单地不允许递归的硬件上执行。它允许GLSL的时候没有随意写入内存,这是大多数着色器硬件的真实(尽管它正变得越来越真实与时间的能力发挥作用。

所以,GLSL没有递归。任何类型的。

OpenGL Wiki – Core Language (GLSL)

递归是不允许的,甚至不是静态的。静态递归是否存在如果程序的静态函数调用图包含循环。这包括通过声明为 子程序统一变量(下面描述)的变量的所有潜在函数调用。如果单个编译单元 (着色器)包含静态递归或通过子例程变量递归的可能性,则这是编译时或链接时错误。

GLSL 4.5 Specification, Page 115

+1

感谢您的信息。 –