2017-04-25 12 views
2

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; 
} 
+2

Si vous connaissez la profondeur maximale de votre récursion, vous pouvez le remplacer par une boucle et un tableau servi pile –

+0

@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

Répondre

4

Je suppose que

récursion soutenu GLSL

No. GLSL ne fait pas support ou mieux dit autoriser les appels de fonction récursifs.

GLSL ne fait pas. Le modèle de mémoire GLSL ne permet pas les appels de fonction récursifs. Cela permet à GLSL de s'exécuter sur un matériel qui ne permet tout simplement pas la récursivité. Il permet GLSL de fonctionner quand il n'y a pas de capacité à écrire de façon arbitraire à la mémoire, ce qui est vrai de la plupart du matériel de shaders (mais il devient moins vrai avec le temps.

Donc, pas récursivité en GLSL. De toute nature.

OpenGL Wiki – Core Language (GLSL)

et

récursivité est pas permis, même pas statiquement. récursion statique est présent si le graphe d'appel de fonction statique de un programme contient des cycles. Ceci inclut tous les appels de fonction potentiels à travers les variables déclarées comme uniforme de sous-programme (décrit ci-dessous). Il s'agit d'une erreur de compilation ou de temps de liaison si une seule unité de compilation (shader) contient une récursion statique ou un potentiel de récursion via des variables de sous-programme.

GLSL 4.5 Specification, Page 115

+1

Merci pour cette info. –