games202-5

距离场SDF软阴影

distance function:描述了空间中任何一点到物体表面的最小距离。通常会定义成带符号的距离,物体内部负号;物体外部正号。如下图是在二维平面对字母A进行的距离函数进行可视化;左侧是直接打印数据、右侧是等值线,相同颜色的一圈距离相等。

如下图是对两个运动状态进行混合,得到运动边界。A是当物体运动到第一个位置时的图片;B是当物体运动到第二个位置时的图片。如果对两张图的每一个对应像素进行内部线性插值(如50%和50%)会得到第三张图形成了灰色过渡带。如果先将图变换成距离场,再对距离场进行内部线性插值/相加,则会得到正确的结果。距离场可以得到物体边界。

距离场可以做任何形状的混合。如图对于两个图形,可以先转变为距离场,将两个距离场靠近和融合,混合成新的图形,得到几何上很好的过度。

1、可以用作光线追踪实现与场景求交

假设场景已经传换成了距离场。从相机发出的光线与距离场定义的隐含表面求交:假设对于点p,其SDF值为m;则不管从点p朝哪个方向发射,走m,都不会与任何物体碰撞。这个距离称为安全距离,从而实现在该方向上的步进。循环多次,直到步长(安全距离)小到一定范围,即可认为光线与物体相交。如果步进次数达到多次还不满足步长与物体相交的条件,则抛弃这根光线。

对于场景的距离场,可以为场景每一个物体计算距离场,对于任意一点,找到该点到各个物体SDF值的最小值,即距离该点最近的物体的SDF值。

2.可以用作生成软阴影

软阴影需要阴影从0-1过度。pcf的做法是根据距离比自适应生成过滤范围大小,从而使得模糊程度不同。在SDF的方法中,在着色点到光源(光源有一定大小)中心的光线上,可以用上述方法在光线方向逐步递进。找到所有安全距离最小的点,也就是安全角度最小的点。安全角度小说明距离遮挡物近,如果光源有大小会遮住更多物体,阴影更硬。反之,越软。当角度大于某个值,可以认为没有阴影。该方法没有具体计算安全距离和光源大小的比值,只是用角度近似判断;也不考虑物体会出现在安全距离球体内的哪里。

可以利用三角函数计算球的切线从而计算安全角度,但开销较大。与其求arcsin,可以直接用比值近似,并且将取值归一化到0-1(此处0不可见、1可见)。k的取值决定了软硬过度程度,即总体软硬。k值越小越软,过度范围越大。k值越大,过度范围越小,阴影越硬。

SDF的优势:速度快,相比于阴影图渲染两次快的(不考虑SDF的生成时间,此处只考虑拿来用的数据),生成的软阴影质量高。劣势:需要预计算和存储SDF,对于动态物体需要逐帧更新,需要较大的存储空间,有其他的走样,表面参数化不好得到,不容易贴uv。

环境光照(不考虑阴影)

贴图记录了来自四面八方的光照结果。环境光照认为光照来自无限远,也就是假如给场景中桌上的两个不同物体渲染环境光会是相同的结果。假如环境光中有一张桌子,因为认为来自无限远,也不能把物体渲染放置在桌上。(也就是相比于原来path tracing的场景,比起场景中个别点光源或者面光源;环境光相当于四面八方都有无穷远的光源,对于场景中的任何一点,L相同且已知)

环境光不考虑阴影。任何方向都可能有光线达到,当然只考虑正半球的光照。此处要解决的问题是对于每一个点的shading,能否不通过采样计算。

如果在积分的过程中,BRDF是glossy的,那么积分限是小区间(覆盖了球面很小部分);如果BRDF是漫反射的,那么意味着积分限是大的,但是非常平滑smooth(值的变化不大,L也可以默认是各个radiance都是相同的)。

此处对积分域说明:理论上说是对半个球面积分,但是实际上只用对在i方向有贡献的入射光区域积分即可。对于漫反射,任何方向的入射光都会对i方向有贡献;对于glossy材质,镜面反射方向周围的部分入射方向才会对i方向有贡献。

image-20230717223838602

积分近似公式的要求,所以可以使用前一节介绍的近似公式进行拆分。

image-20230717224423488

着色是光照和表面BRDF综合作用得来的,对于每个表面的着色,要逐个考虑光线和表面BRDF比较麻烦,所以把光照项和BRDF拆分考虑。此时方程表示的是,平均光照(将积分域内的irradiance平均)与BRDF共同作用——>可以理解为事先把环境光贴图进行一系列不同大小的平均滤波,以对应不同积分域的BRDF,对于这些光线,表面BRDF积分域越大(越漫反射),就选择更大的滤波核滤波后的环境光贴图(更模糊)对其采样。不过此处的滤波不是卷积,而是立体角,不同的滤波和即选择不同的立体角,所以需要将立体角的范围对应到纹理。

image-20230717224535632

如下可以使用mipmap生成,使用时进行三线性插值。

image-20230717224847876
split sum

​ 原先的光线着色计算过程是,对于给定的相机到着色点的光线(出射光),在对出射光有贡献的入射光积分域进行多次采样,将多次采样得到的计算结果平均。经过预滤波后的光线着色计算过程:先对环境光贴图进行不同大小核的滤波,对于glossy材质,在出射光的镜面反射入射光方向采样一次即可(镜面反射方向周围的区域范围需要已知)。对于漫反射材质,查询方向规定为法线方向。

image-20230717230207930

对于积分BRDF:

​ 考虑到微表面的BRDF涉及菲涅尔项和法线分布等至少五维(观察角度、基础反射率RGB三通道、法线分布(粗糙度表示))的数据处理,直接暴力预计算不可取,需要通过一些近似来降低维度,以此来简化预计算。

image-20230717231832694

​ 不考虑G,首先对F函数和D函数进行近似。F函数可以近似成一个由基础反射率和入射角度的指数函数。D函数可以近似成一个半程向量和粗糙度的函数,半程向量可以近似成入射角度相关的数。此时五维的函数降为成三维。

有关BRDF的积分可以进行如下变换,将基础反射率拆出积分,积分内部只有变量粗糙度和入射角度。对于这两个变量的不同取值,每一个值都可以预计算积分值并且保存在纹理中。这样对于一个着色点,不需要输入五个参数计算积分,只需要通过两个参数采样一次即可。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信