Bonjour je suis assez nouveau à GLSL et a couru dans cette erreur en essayant d'écrire l'appel récursif suivant. J'ai vu beaucoup de démos d'implémentations de traçage Ray récursif dans GLSL donc j'ai supposé que GLSL supportait la récursivité.
N'est-ce pas le cas?Récursivité dans GLSL interdite?
OpenGL renvoie un message d'erreur de compilation:
Error: Function trace(vec3, vec3, vec3, int) has static recursion
Ceci est ma définition de la fonction
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;
}
Si vous connaissez la profondeur maximale de votre récursion, vous pouvez le remplacer par une boucle et un tableau servi pile –
@MrD Yep ici petit exemple de ce [réflexion et réfraction impossible sans récursif ray tracing?] (https://stackoverflow.com/a/45140313/2521214) – Spektre