在2015年SIGGRAPH电子艺术展上的演讲中,他们介绍了使用3D纹理与视锥对齐的体积渲染方法。

该技术需要两个步骤:


颜色的注入并将其密度转换为3D纹理,
沿着纹理的Z轴进行集成。

集成代码示例位于幻灯片27上。有谁能解释该代码(完全标准的raymarching集成)有什么问题吗?

#1 楼

接下来的两张幻灯片似乎解释了问题所在:这导致了不节能的结果,体积的表观亮度根据散射系数而变化。

我读过这是因为“错误”的集成代码隐含地假设每个体素范围内的透射率恒定。但是问题是,当散射系数高时,单个体素内的透射率将显着下降。例如,如果您的体素大小为10 cm,但散射系数为1 /(5 cm),则透射率将下降exp(10 cm / 5 cm),或者在整个长度上约为7.4倍。因此,根据幻灯片28,一种更好的方法是显式考虑整个体素长度上的透射率下降,同时仍然假定散射光恒定。幸运的是,积分具有简单的封闭形式的解决方案。因此,他们说要在积分循环中评估每个体素的公式,以代替以前的“错误”公式。 br />
accumScatteringTransmittance.rgb += scatteringExtinction.rgb *
    accumScatteringTransmittance.a;


与此: (即前面所有体素的最终透射率),然后accumScatteringTransmittance.a因子说明了体素内部的透射率变化。

评论


$ \ begingroup $
谢谢。我怀疑这是因为最近我在这里尝试了Cloud raymarchind示例代码形式:gamedev.net/forums/topic/680832-horizo​​nzero-dawn-cloud-system / ...可能已经纠正了方法。我并不完全理解如何实现此公式。看起来当在公式之前加上S时,括号之间剩下的是透射率?我需要将其放在output.w中以进行进一步的重建。
$ \ endgroup $
–narthex
17-10-22在9:12



$ \ begingroup $
@narthex我对修改后的集成的代码应该是什么样子的猜测添加到了答案中。
$ \ endgroup $
–内森·里德(Nathan Reed)
17-10-22在22:11

$ \ begingroup $
这是我的比较-标准与更正(以上代码):imgur.com/a/POTaD。但是差异只有在非常高的散射下才可见。校正也导致除以零,因此需要较小的ε。
$ \ endgroup $
–narthex
17-10-27在14:02