本节代码使用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,可以看到当鼠标移动时,会有抖动。