禁止在GLSL中递归
Recursion in GLSL prohibited?
我在尝试编写以下递归调用时遇到了此错误。我已经看到了许多在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页
相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 到连接组件算法的问题(递归)
- 如何使用递归打印修改后的星号三角形图案
- 使用递归模板动态分配的多维数组
- 递归函数有效,但无法记忆
- 禁止在GLSL中递归