不同渲染方法在不同场景上的对比

不同渲染方法在不同场景上的对比

mitsuba 0.6

说明

使用环境

  • Ubuntu
  • mitsuba 0.6

场景文件

  • https://github.com/bacTlink/mitsuba-CPPM-scenes

一些问题

  • 没有 sudo 权限运行时指定动态库加载位置
1
export LD_LIBRARY_PATH=~/mitsuba-VCM/dist/
  • 上传文件
1
scp -i rsa -P portNum -r localDir xx@xx.xx.xx.xx:serverDir

结果对比

  • mitsuba 是通过修改 integrator 来修改具体的配置的

artware 场景

path

  • 路径追踪
  • Path tracer
  • mitsuba 的参数
参数 类型 作用
maxDepth integer 最大路径长度
rrDepth integer 大于设定值之后,采用俄罗斯轮盘赌的方式以一定概率停止(5)
strictNormals boolean 严格法线(false)
hideEmitters boolean 隐藏直接光源(false)
  • 严格法线:法线插值带来的问题,可能出现这样子的情况
    • 根据插值法线,光线是从物体外面击中物体,但是根据实际的几何法线,光线是从物体里面击中的
      • 漏光效果
    • 设置为 true 会将这些光线去除
    • They can lead to paradoxical situations where a light ray impinges on an object from a direction that is classified as “outside” according to the shading normal, and “inside” according to the true geometric normal.
  • 配置文件
1
2
3
<integrator type="path">
<integer name="maxDepth" value="5"/>
</integrator>
  • 运行渲染器
1
~/mitsuba-VCM/dist/mitsuba -o artware_PATH_maxdepth=5 artware_SPPM.xml
  • 将导出的 exr 格式的图片转化为 png 格式
1
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_PATH_maxdepth=5.exr
  • 运行时间很短,效果如下,整个场景很暗,直接找到的有效路径很少

  • 将最大深度修改为 33(和 SPPM 一致),效果如下
    • 虽然场景亮了一些,效果还是不太好,还是找不到有效的路径

bdpt

  • 双向路径追踪
  • Bidirectional path tracer
  • mitsuba 的参数
参数 类型 作用
maxDepth integer 最大路径长度
rrDepth integer 大于设定值之后,采用俄罗斯轮盘赌的方式以一定概率停止(5)
lightImage boolean 每条从 camera 除法的 subpath 是否直接对光源采样(true)
sampleDirect boolean 是否采用直接采样策略(true)
1
2
3
<integrator type="bdpt">
<integer name="maxDepth" value="33"/>
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_BDPT_maxdepth=33 artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_BDPT_maxdepth=33.exr
  • 效果如下,和 path tracing 相比而言,能够获得更好的效果,简单体现在整体亮度更亮
  • 而且能够较好的模拟焦散的现象,对于手电筒的发光也能较好的模拟

  • 修改一些参数我们看看结果
1
2
3
4
<integrator type="bdpt">
<integer name="maxDepth" value="33"/>
<boolean name="lightImage" value="false"/>
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_BDPT_maxdepth=33_lightImage_false artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_BDPT_maxdepth=33_lightImage_false.exr
  • 结果如下,我们去除了路径对光源的直接采样,最终的结果没有这么亮,相当于能够采样到光源的路径变少了
    • 但是为什么焦散现象也变少了,这个应该是 SDS 路径

1
2
3
4
<integrator type="bdpt">
<integer name="maxDepth" value="33"/>
<boolean name="sampleDirect" value="false"/>
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_BDPT_maxdepth=33_sampleDirect_false artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_BDPT_maxdepth=33_sampleDirect_false.exr
  • 感觉没多大区别

photonmapper

  • photon mapping
  • 简单使用默认参数设置
1
2
3
<integrator type="photonmapper">
<integer name="maxDepth" value="33"/>
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_pm_maxdepth=33 artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_pm_maxdepth=33.exr
  • 结果如下,PM 算法
    • PM 作为一种无偏的算法,最大的问题就是会产生一种糊的感觉
    • 但是由于加入了对于焦散的优化查找,最终也能模拟焦散的结果

  • 传统的 PM 算法是模拟不了 焦散的现象的,参数如下
1
2
3
4
<integrator type="photonmapper">
<integer name="maxDepth" value="33"/>
<float name="causticLookupRadius" value="0.0">
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_pm_maxdepth=33_no_caustic artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_pm_maxdepth=33_no_caustic.exr

ppm

  • Progressive photon mapping integrator
  • 渐进式光子映射
  • 多次累计,一起估计
1
2
3
4
<integrator type="ppm">
<integer name="maxDepth" value="33"/>
<integer name="maxPasses" value="100" />
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_PMM_maxPasses=100 artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_PMM_maxPasses=100.exr
  • 运行速度比 SPPM 慢很多,初始的建立以及每个 pass 都比较慢
  • 效果如下
    • 比 PM 的效果更好,而且不会导致内存爆炸的问题,运行速度比 PM 慢
    • 噪点比较多,收敛的问题

sppm

  • Stochastic progressive photon mapping integrator
  • 随机渐进式光子映射
  • 分批生成,分批估计
  • 服务器上给的参数直接尝试运行时间太久了,我们把 pass 修改为 100
1
2
3
4
5
6
7
8
9
10
<integrator type="sppm">
<integer name="maxDepth" value="33"/>
<boolean name="strictNormals" value="true"/>
<integer name="kNN" value="10" />
<integer name="maxPasses" value="100" />
<integer name="stepSnapshot" value="10000" />
<integer name="photonCount" value="655360" />
<float name="k" value="0.8" />
<float name="beta" value="1.2" />
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_SPMM_maxPasses=100 artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_SPMM_maxPasses=100.exr
  • 运行时间相对较长,效果如下
    • SPPM 算法达到收敛需要比较长的时间,我们只是使用了 100 pass,因此图上还是出现了一些模糊的现象(有偏导致的)

  • 增大 maxPasses = 1000,效果如下
    • 我们可以看到整体而言,模糊程度比 100 小了好多,这是因为 PM 是一致的
      • 当采样数足够多的时候,\(\Delta S\) 足够小,此时是正确的
    • 但是出现了一些白色的亮点,这是由于高贡献路径采样概率小导致的,需要更多的采样数直至收敛才能解决

mlt

  • Path SpaceMetropolis Light Transport
  • 利用 MCMC 算法能够比较快的从一条有效路径找到其他有效路径
1
2
3
4
<integrator type="mlt">
<integer name="maxDepth" value="33" />
<boolean name="twoStage" value="false" />
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_MLT_not_2stage artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_MLT_not_2stage.exr
  • 运行很快
  • 能够采样到一些概率较低的路径,但是整体而言效果并不是很好,可能需要其他算法的初始路径作为根据

  • 2stage:第一遍得到一张低分辨率的图(用于估计分布),第二遍开始真正的渲染
1
2
3
4
<integrator type="mlt">
<integer name="maxDepth" value="33" />
<boolean name="twoStage" value="true" />
</integrator>
1
2
~/mitsuba-VCM/dist/mitsuba -o artware_MLT_2stage artware_use.xml
~/mitsuba-VCM/dist/mtsutil tonemap -f png -t artware_MLT_2stage.exr
  • 效果如下,感觉不是太懂为什么是这样的,似乎光源都没了

参考资料