游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2166|回复: 4

关于光线追踪算法的一点疑问

[复制链接]

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
发表于 2008-6-25 09:19:00 | 显示全部楼层 |阅读模式
    最近想学习下光线追踪的一般算法.于是开始写个小程序测试.但是碰到了一些问题.
    我在不考虑光线的反射与折射递归(也就是简单的光线投掷方法)的时候,渲染出来的结果还算正确.

    但是如果我加上反射光线的运算后,图片就出现了以下结果:


    光线追踪的trace函数大体是这样的:
Color Context::_trace(Ray ray, int recCnt)
{
    if(recCnt > 5)//递归5次自动结束
    {
        return Color(0.f, 0.f, 0.f, 0.f);
    }
    Vector pos, nor, texcoord;
    Surface* surface;
    //射线与场景求交,intersect函数根据ray和场景求交,后几个参数分别返回交点的位置,
    //法线,纹理坐标和交点所在表面的指针
    if(m_sence->intersect(ray, &pos, &nor, &texcoord, &surface))
    {
        //如果反射率大于0,则递归构造反射光线
        Color result(0.f, 0.f, 0.f, 0.f);
        /*if(surface->getMaterial()->getReverberationRate() > 0.0f)
        {
            Ray reverberationRay(pos, nor*2*nor.dot(ray.getDirection()) - ray.getDirection());
            result += surface->getMaterial()->getReverberationRate() * this->_trace(reverberationRay, recCnt + 1);
        }*/
        //计算场景中各个光源照在此点产生的颜色,并通过阴影光线生成阴影
        result += m_sence->lightColor(ray, pos, nor, texcoord, surface);
        return result;
    }
    else//如果和场景没有交点,则返回背景颜色
    {
        return Color(0.f, 0.f, 0.f, 0.f);
    }
}

    如果我把其中注释掉的代码打开,就会变成第2张图那样面目全非的结果.
    请教下各位达人,这是什么问题?

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2008-6-25 09:20:00 | 显示全部楼层

Re: 关于光线追踪算法的一点疑问

图片发错了,从新发下:


34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2008-6-25 13:09:00 | 显示全部楼层

Re:关于光线追踪算法的一点疑问

  呃...找到问题了.构造新射线并与场景求交后,由于浮点数的精度问题,有可能把发出射线那点所在表面自身计算成该射线穿越的距离最近的交点......
  解决方法我是简单的把if(dis > 0.f)改成了if(dis > 0.0001f).
  不知道这么改会不会有什么新的后遗症.

34

主题

70

帖子

76

积分

注册会员

Rank: 2

积分
76
 楼主| 发表于 2008-6-25 13:10:00 | 显示全部楼层

Re: 关于光线追踪算法的一点疑问



上面那个白圈太假了...

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-6-30 08:37:00 | 显示全部楼层

Re:关于光线追踪算法的一点疑问

浮点数比较的时候一定要用absf(fValue - fRef) < fDelta这种形式,只要你的场景坐标单位不改变,fDelta可以恒定,当然如果你想更通用的话,可以用射线原点到求交点的向量长度是否为0来做进一步筛选,判断两个浮点数是否相等比较麻烦,但判断一个浮点数是否等于0是很精确的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 03:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表