结果出现了一些错误,波纹壁出现,一般情况下不应该有涟漪,应该是一种简单的漫射材料,但现在它有涟漪,但我找不到问题。请帮助我,谢谢。
路径跟踪代码:
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));
}
答案 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;