我的 julia 射线追踪器 returns StackOverFlowError
My julia ray tracer returns StackOverFlowError
我正在尝试在 julia 中编写光线追踪器,但我的主要函数 returns WhosebugError。下面是我的主要功能:
function trace(ray::Ray, surfaces::Array{Any, 1}, depth::Int64, maxDepth::Int64)
material, t = findIntersection(ray, surfaces, Inf)
if typeof(material) == Empty
Vec3(0,0,0)
end
if depth > maxDepth
Vec3(0,0,0)
end
if material.isLight == true
material.emittance
end
normal = material.normal
ρ = material.reflectance
BRDF = ρ/3.14159
R = randHemi(normal)
cosθ = dot(R,normal)
newRay = Ray(ray.s + t*ray.d, R)
In = trace(newRay, surfaces, depth+1, maxDepth)
2.0*3.14159*BRDF*In
end
这是我的交集函数:
function findIntersection(ray::Ray, surfaces::Array{Any, 1}, tmin::Float64)
hitSurface = Empty(Vec3(0,0,0), Vec3(0,0,0), Vec3(0,0,0), false)
for surface in surfaces
t = intersect(surface, ray)
if t < tmin
hitSurface = surface
tmin = t
end
end
return hitSurface, tmin
end
但是我收到这个错误:
WhosebugError:
Stacktrace:
[1] findIntersection(::Ray, ::Array{Any,1}, ::Float64) at .\In[31]:10
[2] trace(::Ray, ::Array{Any,1}, ::Int64, ::Int64) at .\In[33]:2
[3] trace(::Ray, ::Array{Any,1}, ::Int64, ::Int64) at .\In[33]:18 (repeats
14493 times)
[4] top-level scope at In[35]:1
错误原因是什么?
Whosebug error一般出现在递归调用过多的时候。简而言之,在大多数编程语言中,您可以进行多少次递归调用都是有限制的。
在您的示例中,trace
函数递归调用自身,这可能会导致堆栈溢出。你有一个参数 maxDepth
可以限制它。将其设置为较低的值可能会解决此特定问题。
你的问题是你错过了 return
。
你想要的是
if depth > maxDepth
return Vec3(0,0,0)
end
没有 return,该行只分配一个 Vec3
,代码继续循环。
我正在尝试在 julia 中编写光线追踪器,但我的主要函数 returns WhosebugError。下面是我的主要功能:
function trace(ray::Ray, surfaces::Array{Any, 1}, depth::Int64, maxDepth::Int64)
material, t = findIntersection(ray, surfaces, Inf)
if typeof(material) == Empty
Vec3(0,0,0)
end
if depth > maxDepth
Vec3(0,0,0)
end
if material.isLight == true
material.emittance
end
normal = material.normal
ρ = material.reflectance
BRDF = ρ/3.14159
R = randHemi(normal)
cosθ = dot(R,normal)
newRay = Ray(ray.s + t*ray.d, R)
In = trace(newRay, surfaces, depth+1, maxDepth)
2.0*3.14159*BRDF*In
end
这是我的交集函数:
function findIntersection(ray::Ray, surfaces::Array{Any, 1}, tmin::Float64)
hitSurface = Empty(Vec3(0,0,0), Vec3(0,0,0), Vec3(0,0,0), false)
for surface in surfaces
t = intersect(surface, ray)
if t < tmin
hitSurface = surface
tmin = t
end
end
return hitSurface, tmin
end
但是我收到这个错误:
WhosebugError:
Stacktrace:
[1] findIntersection(::Ray, ::Array{Any,1}, ::Float64) at .\In[31]:10
[2] trace(::Ray, ::Array{Any,1}, ::Int64, ::Int64) at .\In[33]:2
[3] trace(::Ray, ::Array{Any,1}, ::Int64, ::Int64) at .\In[33]:18 (repeats
14493 times)
[4] top-level scope at In[35]:1
错误原因是什么?
Whosebug error一般出现在递归调用过多的时候。简而言之,在大多数编程语言中,您可以进行多少次递归调用都是有限制的。
在您的示例中,trace
函数递归调用自身,这可能会导致堆栈溢出。你有一个参数 maxDepth
可以限制它。将其设置为较低的值可能会解决此特定问题。
你的问题是你错过了 return
。
你想要的是
if depth > maxDepth
return Vec3(0,0,0)
end
没有 return,该行只分配一个 Vec3
,代码继续循环。