【Optix】关于Pathtracing 实时化的讨论

本节代码使用VS2015编辑,可从如下链接下载:

链接:https://pan.baidu.com/s/11soCutkIP8adlYO1fvRi1g 
提取码:g3ft 

本节实现了一个最简单的基于pathtracing的光线跟踪方法,使用了基于随机微平面的理论,我们认为光线击到任何一处,它的反射方向是随机的,因为这一处可以划分为无穷小,现实世界的某一点也是吸收了几乎可以认为是随机方向的各种光的反射效果:

可以看到会有很多的噪点,有跳跃的噪点的原因是反射光线是随机的,在代码中使用如下代码:可以看到随机反射光线的生成依赖了一个random_in_unit_sphere,这是生成随机向量的一个方法。

RT_PROGRAM void closest_hit_radiance()
{

    //种子
    unsigned int seed = tea<16>(bufferSize.x*launch_index.y + launch_index.x, frame_number);
    //生成随机反射光线
    float3 hitpoint = ray.origin + t_hit * ray.direction; //交点
    //法线geometric_normal
    float3 target = hitpoint + geometric_normal + random_in_unit_sphere(seed);

    PerRayData_radiance new_prd;
    new_prd.depth = prd_radiance.depth + 1;

    optix::Ray refl_ray = optix::make_Ray(hitpoint, target- hitpoint, RADIANCE_RAY_TYPE, scene_epsilon, RT_DEFAULT_MAX);

    if (new_prd.depth <= 5)
    {
        rtTrace(top_object, refl_ray, new_prd);
        prd_radiance.result = 0.5*(new_prd.result);
    }
    else
    {
        float t = 0.5*(ray.direction.y + 1.0f);
        float3 resultColor = (1.0f - t) * make_float3(1.0f, 1.0f, 1.0f) + t * make_float3(0.5f, 0.7f, 1.0f);

        prd_radiance.result = resultColor;
    }

}

而使用蒙特卡洛方法实现pathtracing使用了大量的概率性随机的pdf,因此使得画面虽然精美,但是一移动却会抖动。因为反射光线具有随机性。因此目前笔者认为使用概率性随机理论的蒙特卡洛方法不适宜做实时光线跟踪。读者可以运行官方例子optixPathTracer,可以看到当鼠标移动时,会有抖动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值