Graphics 如何改进路径跟踪器?

Graphics 如何改进路径跟踪器?,graphics,raytracing,Graphics,Raytracing,结果出现了一些错误,波纹墙出现了,正常情况下不应该有波纹,它应该是一种简单的漫反射材料,但是现在它有波纹,但是我找不到问题。请帮助我,谢谢 路径跟踪代码: 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::

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

路径跟踪代码:

    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.0001f
//在代码中。。。
vec3 normal=对象点击->正常;//我想这是正常化的
vec3命中点=对象命中->命中点;
命中点+=正常*浮点错误//浮点数误差的计算
vec3新向量原点=命中点;

您可以发布实际的代码片段而不仅仅是图像吗?对不起,我发布了代码。您可以指定“它有错误”以外的内容吗。什么不起作用?它会崩溃吗?你能提供一些案例的输入、收到的输出和预期的输出吗?然后编辑问题来说明这一点。此外,将所有代码作为代码而不是图像发布。此问题应该关闭,因为它没有将代码作为问题中的文本提供。如果您的代码太大,请提供一个较小的示例来重现问题。