你好我是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;
}
如果你知道你的遞歸的最大深度可以用一個循環替換它和陣列充當堆疊 –
@MrD沒錯的在這裏小例子[反射和折射不可能沒有遞歸光線追蹤?](https://stackoverflow.com/a/45140313/2521214) – Spektre