GAMES101 - FinalProject - YXH_XianYu
Simple Rendering Homogenous Participating Media
我完成了 2.2.1 体积散射 的 退化版
效果图
- images文件夹下,存放各种不同参数的效果图(参数说明见文末)
演示视频
如何实现:
我在作业7框架的基础上进行修改
参考了《Rendering Participating Media with Bidirectional Path Tracing》来实现效果
- 跳过了论文的第4节,没有实现双向路径追踪
- 由于数学水平的限制,没有完全按照论文中的公式来实现体积散射
均匀介质的体积散射(主要修改了 Scene.cpp 中的 castRay函数)
若光线传播距离超过1000单位,则判断光线散射;
若光线传播距离不超过1000单位,则按照普通路径追踪递归处理。
光线根据 scattering函数(相位函数?),决定散射的方向
- scattering函数:在球面上随机一个方向,与光线传播方向取均值后,输出该向量。
获得光线散射出的方向后,递归处理新光线
递归公式 $L_{indir} = castRay(new_ray) * \Large\frac{\sigma}{\kappa}\normalsize * \frac{1}{RR} $
- $\Large\frac{\sigma}{\kappa}$: 散射的能量损失
非均匀介质的体积散射
- 没成功实现
- 思路一:利用一团团离散的、不同性质的介质团,来模拟非均匀介质
- 在 Scene.cpp 中,尝试实现了多种介质团,但无法模拟出尘土等介质
- 废弃代码位于 Scene.cpp 末尾
- 思路二:利用噪声函数,来模拟非均匀介质
- 在 Perlin.hpp 中,实现了三维柏林噪声函数,但无法模拟出尘土等介质,或是类似《大作业选题参考》中效果图的那种体积散射效果。
效果图分析
- 参数说明:
- *p:分辨率
- spp*:采样率
- sigma*:散射率/消光率。值过大,无散射效果;值过小,图像过暗。
- *dir:”scattering函数”中,光线方向所占的权值。值过大,无散射效果;值过小,雾气透明度过低(若dir=0,则散射时光线随机弹射)
- 效果图边缘的明显分界线,是因为散射距离过远,若散射距离为500,则整个场景都会被雾气覆盖
- 256p, spp64, sigma0.5, 0dir
- 392p, spp256, sigma0.7, 4dir
- 392p, spp256, sigma0.7, 16dir
- 2048p, spp512, sigma0.7, 16dir
- 参数说明: