可运用于实时渲染的高性能光栅化技术,质量接近光线追踪阴影质量。本篇注重个人理解而非原理的具体诠释。

论文:https://www.cspaul.com/publications/Rosen.2012.I3D.pdf

论文首页的效果预览图

个人概述

通过将均匀的用于记录阴影的网格进行变形,使得重要性高信息处可用像素多,反之少,解决传统阴影映射的“均匀”所带来的低质量问题。

方法

1、构建重要性图

重要性图本身是定义光源图像平面上的规则网格,每个单元对应一个重要性值,零值为不需要,非零表示相对重要性。

具有三种构建方法:前向分析(光源视角)、后向分析(期望视角)、混合分析(二者结合)。

使用重要性函数计算重要性值,各自结果相乘为最终值。论文给出四种函数:

期望视角函数:是否在视角内。(适用于后向分析,前向分析若大阴影投射物遮挡区域,可能导致区域未采样)
距离到眼睛函数:离眼睛越远,图像越小,采样需求越低。(均适用)
阴影边缘函数:提高阴影边缘区域采样率。(直接作用于低质量阴影的最明显特征。论文称仅适用于前向分析)
表面法线函数:距离视点一定距离的表面,当朝向视点方向时,其投影屏幕空间面积最大;旋转至垂直于视线时,投影面积为零。(均适用)

此外,论文还提及时间一致性。RTW本身只保证空间采样一致性,重要性函数未显式提供时间一致性,即当前帧画面在采样上认为某区域很重要,但下一帧可能会认为不那么重要。解决方案为将当前帧与上一帧的重要性图进行混合,而论文发现此方法通常不必要——RTWSM本身表现得已经很好。

个人判断可以自己创造重要性函数进行更深度的优化。此外,“适用”应该由项目具体需求而定。在部分Minecraft光影的应用中,个人发现阴影边缘函数被用于后向分析而非前向分析,这可能是出于实时渲染的性能需求。本质区别可能是:前向分析需要渲染光源深度图,其物理精确性高,而后向分析基于屏幕空间近似,精确性相对低,但计算成本低。

2、将2D重要性图转换为1D变形图

对重要性图,每一行计算垂直方向的重要性分布,生成Y轴变形图,对于每一列计算水平方向重要性分布,生成X轴变形图。相同点在于取这一行/列的最大重要性值。

对于生成的1D重要性分布可以进行高斯模糊而平滑采样率突变,避免后续变形图出现走样,同时减轻因离散采样导致的非线性光栅化误差。

归一化重要性,通过累积分布函数,将1D重要性分布转换为变形图。
例:

3、渲染RTW阴影图

通过1D变形图动态调整阴影贴图的采样分布。

(1)顶点处理:对每个顶点,使用视图矩阵与投影矩阵,计算裁剪坐标坐标。应用变形映射,从裁剪空间[-1,1]映射到纹理坐标[0,1]。查询水平/垂直变形图,计算变形后的坐标,具体公式类似s'=s+warpx(s),此后将s'重新映射回裁剪空间。保留深度值z不变,输出变形后的顶点。
(2)非线性光栅化:论文方法为使用 GPU细分硬件 将三角形细分为小片元,确保每个片元在变形后的屏幕空间中尺寸足够小(如不超过2.5%的阴影图尺寸),避免走样。
(3)深度写入:将变形后光栅化的片元深度值写入RTW阴影贴图。

4、渲染输出图像

(1)对输出图像的每个像素计算其纹理坐标。
(2)查询1D变形图,对纹理坐标进行逆向变换得到实际采样坐标。
(3)使用采样坐标,由RTW阴影贴图获取深度值,并与当前像素的深度值比较。
此处:硬阴影中阴影结果只分0/1,而软阴影(PCF)需要在采样坐标周围进行多重采样并混合阴影结果。
(4)将阴影结果与光照颜色相乘,生成最终像素值。
colorfinal = colorlit · (1 - result)

尾注

我是在何处知道此知识的:首次接触RTWSM为 Luna5ama 开发的外屏七Minecraft光影,相关链接为 https://github.com/Luna5ama/Alpha-Piscium