我的 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,代码继续循环。