Cornell box的bug定位及修复

--------------------------------Bug--------------------------------------

直接运行 ti example cornell_box ,可以看到有黑圈artifact

--------------------------------排查-----------------------------

[1] 注释了第354行
direct_li += fl * w * nl / light_pdf

[2] 但是软阴影明显不对!

--------------------------------原因------------------------

[1]Direct lighting(Ld)有误
第356行:
direct_li += fl * w * nl / brdf_pdf
这个是用sample之后的dir当做light方向,这应当是indirect lightingt(Li)才对,而Li下次迭代会计算
这个该注释掉。

[2] rounding error
行232:
a, b, c, mat = intersect_scene(pos , ray_dir)
应改为:
a, b, c, mat = intersect_scene(pos+eps*ray_dir, ray_dir)
防止浮点精度不够,始终检测碰撞到同一点,更加正确的做法:
http://www.pbr-book.org/3ed-2018/Shapes/Managing_Rounding_Error.html

-------------------------------------结论---------

我认为应该注释掉行346到356,然后修改行232

效果如下:

---------------------------------------电脑配置---------------------

e31231v3 + rtx2070s + cuda11.0 + win10 2004

3 个赞

感谢!!能否发个PR把bug fixes merge进来 :slight_smile:

1 个赞

说出来怕你见笑,不太会用git,。。。 我查一下怎么弄,话说fix bug我有权限吗

2 个赞

我fork,edit,commit就行了吗? :cold_face:
因为只会用svn,所以打了一大堆字,本来想让你们开发者fix的

话说fix bug我有权限吗

有的哈。你可以通过提交pull request (PR)把这些bug fixes的代码提交上来 :slight_smile:

git上手确实学习曲线有点陡。。。不知道GitHub Standard Fork & Pull Request Workflow · GitHub 是否有帮助?一般来说,创建pr的流程是:

  1. GitHub - taichi-dev/taichi: Productive & portable high-performance programming in Python. "fork"到你个人的repo
  2. git clone 你个人forked的那个repo到本地:git clone git@github.com:${Your Github Username}/taichi.git
  3. 在本地新建一个branch,比如: git checkout -b fix ,其中fix是branch name,可以随意起名。
  4. fix bugs in examples/cornell_box.py!
  5. git commit -a,这时候会跳出一个text editor让你输入该commit的信息。taichi本身对commit信息格式有一定要求。你的这个情况写成[example] Fix cornell_box dark rings之类的就好(重点是需要[example]这个label)
  6. 最后把你本地这个branch push回远程:git push -u origin fix。然后你就可以在github里点"create pull request"了 :slight_smile:
4 个赞

Emmm,git clone了一下没成功,我直接在网页上点了几下:


这样算是ok了吗

2 个赞

是的,成功提交了!后面我们会review并且提出一些修改建议。非常感谢!

2 个赞

:+1: :+1: :+1:

1 个赞

kuang ye大神指导下,我发现我提出的需要注释的代码是有误的


该代码是mul importance sample的brdf部分:

注释掉之后,就变成了:只 sample light source,是上文中一种bad strategy


我犯了这个错误,是因为我之前学了另一种方法实现mis:把brdf的mis放到了下次迭代

这种做法的好处是:
[原来的方法] 每次迭代需要sample两次方向,计算三次brdf的颜色,以及一次额外的射线和灯光是否相交
[另一种方法] 每次迭代需要sample一次方向,计算两次brdf颜色,不用多余的相交判断

需要增加的代码就是在碰撞到光源且depth>0时,补上一项:
if hit_light:
acc_color += throughput * light_color * powerHeuristic(brdfPdf, lightPdf) / brdfPdf

该方法完整实现代码:


2 个赞