反射阴影贴图:第1部分

图片

哈Ha! 我向您介绍埃里克·波尔曼(Eric Polman)撰写的文章“反射阴影图”的翻译。

反射阴影贴图 (RSM)是扩展“简单” 阴影贴图的算法。 该算法考虑了第一次撞击表面后散射的光( 漫反射 )。 这意味着除了直接照明外,您还将获得间接照明。 在本文中,我将从官方文章中分析该算法,以人为解释。 我还将简要讨论阴影映射

阴影贴图


阴影映射 (SM)是阴影生成算法。 根据该算法,我们在深度图中存储从光源到物体的距离。 图1显示了深度图的示例。 它存储每个像素的距离(深度)。

图片
图1:此图显示了深度图。 像素越近,它越亮。

因此,当您具有光源的深度图时,就可以根据相机绘制场景。 要确定对象是否点亮,请检查从光源到对象的距离。 如果到对象的距离大于阴影贴图中存储的值(深度),则对象在阴影中。 这意味着该主体不应被点亮。 图2显示了一个示例。 您对每个像素进行这些检查。

图片
图2:从光源到阴影中像素的距离大于存储在阴影图中的距离。

反射阴影贴图


既然您了解了阴影映射的基本概念,我们将继续使用反射阴影映射 (RSM)。 该算法扩展了“简单” 阴影贴图的功能 。 除了深度数据外,您还存储世界空间(在世界坐标系中)的位置 ,世界空间法线通量 (光输出)。 我将解释为什么您需要此数据。

资料


世界空间位置


RSM世界空间中,必须存储位置以便确定像素之间的距离。 这对于计算光的衰减很有用。 经过一定距离后,光会减弱(变得不那么集中)。 空间中两点之间的距离用于计算光强度。

正常的


法线(世界空间)用于计算表面的光反射。 对于RSM,它们还用于确定给定像素是否为另一个像素的光源。 如果两个法线实际上是重合的,它们将不会给彼此太多的反射光。

光通量(Luminous Flux)


磁通量是光源的光强度。 它的度量单位是流明 ,这是您当前在灯泡包装上可以看到的一个术语。 该算法在绘制阴影图时为每个像素存储通量 。 通过将光强度乘以反射系数计算通量 。 对于定向光,您将获得均匀照明的图像。 对于聚光灯,还应考虑入射角。 没有考虑衰减和接收余弦(在法线和光矢量之间),因为在考虑间接照明时会考虑到这一点。 本文将不涵盖详细信息。 图3显示了官方文章中的聚光灯纹理。

图片
图3:描绘了RSM中包含的四张卡。 从左到右:深度图,世界空间位置,世界空间法线,通量。

数据应用


现在已经生成了数据(理论上),是时候将其应用于最终图像了。 绘制最终图像时,将计算每个光源对每个像素的影响。 除了使用光源简单地照明像素之外,您现在还可以使用Reflective Shadow Map

一种简单的计算照明贡献的方法是遍历RSM中的所有纹理。 您检查一下RSM中来自纹理像素的光是否击中了您正在计数的像素。 这是使用世界空间位置和世界空间法线完成的。 您可以计算从RSM纹素中的世界空间位置到像素的方向。 然后,使用向量的标量积将其与法线进行比较。 任何正值表示必须使用通量照明像素,该通量存储在RSM中图4显示了该算法。

图片
图4:根据世界空间位置和法线演示间接照明的作用。

阴影贴图 (和RSM )本来就很大(512x512 = 262144像素),因此检查每个纹理像素远非最佳。 相反,最好从地图中提取一定数量的样本。 样本数量取决于硬件的功能。 样本数量不足会产生伪影,例如条纹或闪烁。

对照明结果影响最大的纹理像素最接近计算的像素。 采样方法将收集像素坐标附近的大多数样本,从而获得更好的结果。 该方法称为“重要性采样” 。 官方文章描述了采样密度随距我们正在计算的像素的距离的平方而降低。

我们还需要考虑到取决于距离的因素来缩放样本的强度。 这是由于以下事实:虽然纹理像素的采样频率较低,但它们位于更远的位置,实际上它们会影响相同数量的通量。 因此,在较远的像素中,您需要增加强度以消除不等式,同时保持少量的样本。 图5显示了它是如何工作的。

图片
图5:重要性抽样。 从中心获取更多样本,并且根据样本与中心点的距离,将样本按比例缩放。 改编自有关RSM的文章。

选配
将当前像素在阴影图上的投影作为点(s,t)。 预先计算相对于(s,t)的采样坐标,并将其作为数组传输到着色器。

您应该将样本视为点光源。 您将光通量值用作光色,并且仅将与像素相对的光源用作光色

结论


官方文章更详细地讨论了该算法的其他优化,但我将对此进行详细介绍。 屏幕空间插值部分描述了如何提高生产率,但是我认为重要性采样就足够了。

第二部分介绍了RSM的实现。

Source: https://habr.com/ru/post/zh-CN440488/


All Articles