--------------------------------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 个赞
k-ye
#2
感谢!!能否发个PR把bug fixes merge进来
1 个赞
说出来怕你见笑,不太会用git,。。。 我查一下怎么弄,话说fix bug我有权限吗
2 个赞
我fork,edit,commit就行了吗?
因为只会用svn,所以打了一大堆字,本来想让你们开发者fix的
k-ye
#5
话说fix bug我有权限吗
有的哈。你可以通过提交pull request (PR)把这些bug fixes的代码提交上来
git上手确实学习曲线有点陡。。。不知道GitHub Standard Fork & Pull Request Workflow · GitHub 是否有帮助?一般来说,创建pr的流程是:
- 把GitHub - taichi-dev/taichi: Productive & portable high-performance programming in Python. "fork"到你个人的repo
- git clone 你个人forked的那个repo到本地:
git clone git@github.com:${Your Github Username}/taichi.git
- 在本地新建一个branch,比如:
git checkout -b fix
,其中fix
是branch name,可以随意起名。
- fix bugs in
examples/cornell_box.py
!
-
git commit -a
,这时候会跳出一个text editor让你输入该commit的信息。taichi本身对commit信息格式有一定要求。你的这个情况写成[example] Fix cornell_box dark rings
之类的就好(重点是需要[example]
这个label)
- 最后把你本地这个branch push回远程:
git push -u origin fix
。然后你就可以在github里点"create pull request"了
4 个赞
Emmm,git clone了一下没成功,我直接在网页上点了几下:
这样算是ok了吗
2 个赞
是的,成功提交了!后面我们会review并且提出一些修改建议。非常感谢!
2 个赞
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 个赞