禁止在GLSL中递归

Recursion in GLSL prohibited?

本文关键字:递归 GLSL 禁止      更新时间:2023-10-16

我在尝试编写以下递归调用时遇到了此错误。我已经看到了许多在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; 
}

我假设GLSL支持递归

否。GLSL不支持或更好地说允许递归功能调用。

GLSL没有。GLSL存储器模型不允许进行递归功能调用。这使GLSL可以执行根本不允许递归的硬件。它允许GLSL在没有任意写入内存的能力时起作用,这对于大多数着色器硬件是正确的(尽管随着时间而变得不那么正确(。

因此,GLSL中没有递归。任何形式。

&ndash; OpenGl Wiki&ndash;核心语言(GLSL(

不允许递归,甚至不允许静态。如果存在静态递归,则如果静态函数呼叫图的图 程序包含周期。这包括所有通过称为的变量来调用的所有潜在函数调用 子例程统一(如下所述(。如果单个编译单元,则是编译时间或链接时间错误 (着色器(包含静态递归或通过子例程变量进行递归的潜力。

&ndash; GLSL 4.5规格,第115页