我怎样才能改善路径追踪?

时间:2017-12-23 04:07:11

标签: graphics raytracing

Code_Screenshot_1

Code_Screenshot_2

Code_Screenshot_3

OutPut or Result

结果出现了一些错误,波纹壁出现,一般情况下不应该有涟漪,应该是一种简单的漫射材料,但现在它有涟漪,但我找不到问题。请帮助我,谢谢。

路径跟踪代码:

    if (r.depth >= max_ray_depth)
    return L_out;

float pdf;
Vector3D w_in;
Spectrum f = isect.bsdf->sample_f(w_out, &w_in, &pdf);
double cos_theta = std::max(0.0, w_in[2]);
if (cos_theta > 0.0 && pdf > 0.0 )
{
    Vector3D pdir = (o2w * w_in - hit_p ).unit();
    pdir.normalize();
    Ray pr(hit_p, pdir, int(r.depth + 1));
    L_out += (f*cos_theta*trace_ray(pr)*(1.0/pdf));
}

2 个答案:

答案 0 :(得分:0)

图像表明你的光线追踪器受到“表面痤疮”的影响,当出站光线与刚刚离开的表面相交时,由于使用数字浮点表示的舍入误差而导致光线追踪器。

解决方案通常是使用阴影偏差 - 在用于启动出站光线的“时间”(或参数)值中添加一个小增量,使其起点稍微远离表面上。

更多详情请见this page上的Surface Acne部分。

答案 1 :(得分:0)

注意:乔恩·汉森已经回答了这个问题

确保反射光线的起点与表面非常微弱。您应该考虑浮动错误。

如何将向量移出表面:

#define FLOAT_ERROR 0.0001f

// in code ...

vec3 normal = object_hit->normal; // I assume this is normalized
vec3 hit_point = object_hit->hit_point;

hit_point += normal * FLOAT_ERROR; //acount for float error

vec3 new_vector_origin = hit_point;