您当前的位置:五五电子网电子知识单片机-工控设备综合-其它利用c++面向对象的方法来实现光线追踪 正文
利用c++面向对象的方法来实现光线追踪

利用c++面向对象的方法来实现光线追踪

点击数:7161 次   录入时间:03-04 11:46:43   整理:http://www.55dianzi.com   综合-其它
    GVector3 color;

    // 计算C = ambient + diffuse + specular

    if(TotalTraceDepth == depth)

    return color;

    else

    {

    //计算射线和物体交点处的反射射线 Reflect;

    GVector3 c = Tracer(Reflect, ++depth);

    color += GVector3(color[0]*c[0],color[1]*c[1],color[2]*c[2]);

    return color;

    }

    }

    创建一个场景,然后执行代码,可以看到下面的效果。

Fig3 光线追踪渲染的场景1

    如果设置Tracer的递归深度大于2的话,就可以看到两个球相互反射的情况。虽然这个光线追踪可以正常的执行,但是画面看起来总觉得缺少点什么。仔细观察你会发现画面虽然有光源,但是物体没有阴影,阴影可以增加场景的真实性。要计算阴影,我们应该从光源的出发,从光源出发的射线和物体如果有交点,而且这条射线与多个物体相交,那么除第一个交点外的后面所有交点都处于阴影中,这点很容易理解。于是,我们需要修改部分代码。

    GVector3 Tracer(CRay R, int depth)

    {

    GVector3 color;

    double shade = 1.0

    for(/*遍历每一个物体*/)

    {

    for(/*遍历每一个光源*/)

    {

    GVector3 L = pObj[k]->getCenter() - Intersection;

    double dist = norm(L);

    L *= (1.0f / dist);

    CRay r = CRay( Intersection,L );

    for ( /*遍历每一个物体*/ )

    {

    CGObject* pr = pObj[s];

    if (pr->isIntersected(r, dist)!=MISS)

    {

    shade = 0;

    break;

    }

    }

    }

    }

    if(shade>0)

    {

    // 计算C = ambient + diffuse + specular

    // 递归计算反射

    }

    return color*shade;

    }

    增加了阴影计算后,再运行程序,就能看到下面的效果。



www.55dianzi.com

Fig4 光线追踪渲染的场景2

    最后我们也可以让地面反射物体,然后再墙上添加很多小球,让画面变得复杂一些,如下图。

Fig5 光线追踪渲染的场景3

    总结

    这篇文章通过利用面向对象的方法来实现了光线追踪渲染场景。利用面向对象的方法来实现光线追踪使程序的扩展性得到增强,渲染复杂的场景或者复杂的几何物体的时候,或者有很多光源和复杂光照计算的时候,只需要从基类继承,然后利用多态性来实现不同物体的不同渲染方法。

    从上面的类图可以看到,利用面向对象的方式可以很容易扩展程序。而且,由于光线追踪的这种结构,不论添加多少物体在场景中,不论物体多么复杂,这种结构总能很好地渲染出正确的画面。

    但是,对光线追踪来说,越复杂的场景需要的渲染时间越长。有的时候渲染一帧的画面甚至需要几天的时间。所以好的算法和程序结构对于光线追踪来说是很重要的,可以通过场景管理、使用GPU或CUDA等等技术来提高渲染效率。



上一页  [1] [2] [3] 


本文关键字:暂无联系方式综合-其它单片机-工控设备 - 综合-其它