1、对灯光位置对场景进行一个深度采样
2、对玩家相机视角观察到的位置进行对灯光深度采样的位置进行深度比较,如果大于灯光采样深度距离则为阴影部分
以上方式会产生大量的锯齿
所以在此基础上继续增加PCSS的操作:
1、对玩家视角观察到的位置,进行n * n矩形范围内的位置进行深度比较,同理,大于灯管采样的深度距离则为阴影部分,否则不是,将n * n矩形范围内的阴影结果进行卷积操作(抗锯齿操作)
2、对玩家视角内观察到的位置进行遮挡物距离计算,距离越大,则n * n矩形中的n值越大,距离越小,n值越小
3、基于以上n * n矩形的范围内,再进行加权平均,什么是加权平均呢?就是离玩家视角内观察到的位置,距离越远,受到的阴影效果越小
由于PCSS的第一步和第三步都是n平方的操作,所以性能不达标,所以就有VSSM的操作
1、计算灯光位置对场景的一个深度采样
2、计算一个深度的平均值的平方,和深度平方的平均值来计算方差
3、通过概率论可以计算出任意一个深度值在第一部的深度采样图的概率排名,通过这个排名就可以直接计算出O(1)大概多少是在阴影内的,根据概率就可以算出对应阴影卷积后的平均值
在UE里面使用:
VSM:
对阴影贴图进行分区
进行分区显示,也做了类似MipMaps的操作,越近,分的区越细腻,阴影贴图展现的精度也越高,如果视口上没有显示的分区,不进行整体渲染,只渲染视口上显示的分区
DFSS(Distance Field Soft Shadows)
已知o是光源,P1是o最近的物体位置,P2是P1最近物体位置,P3是P2最近物体位置,通过距离场:oP1是已知的,P1P2 P2P3是已知的
通过近似的算法直接算出来对应的数值SDF(p)就是P1P2或者P2P3,p-o就是oP1 oP2 oP3这样的值,这样的比例去做近似表达角度大小的数值,角度越大,值越大,阴影越柔软,K值是为了让更多位置大于1,更多位置为硬阴影,k值越大,阴影外轮廓柔度越低,1为最黑的阴影,0~1根据值的大小,线性决定阴影强弱
每个像素,根据求出来的球谐函数的值进行计算
Wavelet对光照的计算
通过Wavelet的各个形状来替换图片上的各个形状
Wavelet不能处理快速旋转的场景,没有Wavelet的图可以快速进行替换,而SH可以对当前这一层的图片进行旋转计算匹配,支持快速旋转的场景
Wavelet不动的时候效果好很多,但是快速旋转不行
所以前向渲染都是通过一个主要光源计算像素
四个次要光源计算顶点
其余光源用球谐函数来计算,依然能达到一个很好的效果