【问题标题】:How can I improve my path tracer?如何改进我的路径跟踪器?
【发布时间】:2018-06-05 14:07:13
【问题描述】:

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));
}

【问题讨论】:

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

标签: graphics raytracing


【解决方案1】:

该图像表明您的光线追踪器患有“表面痤疮”,这是由于出站光线与刚刚离开的表面相交时造成的,这是由于数字浮点表示的舍入误差所致。 p>

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

更多详情请参阅this page 的 Surface Acne 部分。

【讨论】:

    【解决方案2】:

    注意:jon-hanson 已经回答了这个问题

    确保反射光线的来源略微偏离表面。您应该考虑浮动错误。

    如何将矢量移出表面:

    #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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 2015-07-06
      相关资源
      最近更新 更多