首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >光线跟踪器中的递归反射不起作用

光线跟踪器中的递归反射不起作用
EN

Stack Overflow用户
提问于 2015-04-20 04:09:10
回答 1查看 183关注 0票数 0

由于某些原因,在我的光线跟踪器中,如果我试图限制光线跟踪器中递归调用的数量,我的反射率就不起作用。

这是我的反射率代码:

代码语言:javascript
复制
public static int recursionLevel;
public int maxRecursionLevel;
public Colour shade(Intersection intersection, ArrayList<Light> lights, Ray incidenceRay) {
    recursionLevel++;
    if(recursionLevel<maxRecursionLevel){
        Vector3D reflectedDirection = incidenceRay.direction.subtractNormal(intersection.normal.multiply(2).multiply(incidenceRay.direction.dot(intersection.normal)));

        Ray reflectiveRay = new Ray(intersection.point, reflectedDirection);

        double min = Double.MAX_VALUE;
        Colour tempColour = new Colour();

        for(int i = 0; i<RayTracer.world.worldObjects.size(); i++){
            Intersection reflectiveRayIntersection = RayTracer.world.worldObjects.get(i).intersect(reflectiveRay);
            if (reflectiveRayIntersection != null && reflectiveRayIntersection.distance<min){
                min = reflectiveRayIntersection.distance;
                recursionLevel++;
                tempColour = RayTracer.world.worldObjects.get(i).material.shade(reflectiveRayIntersection, lights, reflectiveRay);
                recursionLevel--;
            }

        }

        return tempColour;
    }else{
        return new Colour(1.0f,1.0f,1.0f);
    }

}

如果我去掉了If语句,它就能工作,不过如果我放了太多的反射对象,就会耗尽内存。我不确定是什么导致了这一切。

EN

回答 1

Stack Overflow用户

发布于 2015-08-29 22:43:45

问题是您正在使用recursionLevel作为全局状态,但它实际上应该是局部状态。此外,对于每个对shade()的递归调用,您会递增它两次,而只递减一次。我将按如下方式重构您的代码:

  • 删除recursionLevel全局方法
  • recursionLevel参数添加到您的shade()方法
  • 保留您的<代码>D11检查<代码>H212<代码>H113删除递归调用周围的递增和递减D14递归调用D18的递归调用,使其调用shade(..., recursionLevel + 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29735252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档