games202-4

深度了解PCF

​ pcf除了将当前像素深度和对应采样点p进行比较外,还会与对应采样点周围多个采样点如q进行比较。pcf计算阴影的过程如第一个和第二个公式,f是比较函数即x+(当[]内的结果小于0,则该函数为0;当[]内的结果大于等于0,则该函数为1->即深度测试的过程),w(p,q)是权重,可以根据p和q的距离定义。在范围N中取所有可能的p,将结果相加作为最终结果得到visibility。

image-20230714002636212

​ 因此从第二个公式看出,pcf不是将shadow map进行过滤平均,再将当前像素深度和对应采样点p进行个比较,这样比较的结果还是非0即1。从第三个公式看出,pcf也不是将最后得到的锯齿visibility进行过滤模糊。(p,q应该改为x,y)

image-20230714002921411

​ 根据pcss的三个过程,在第一个求block的平均深度和进行pcf的过程是最耗时的。因为需要遍历filter内的每一个像素,也可以选择不遍历而是通过随机采样的方式得到近似的结果,但这样会引入噪声。采样方式可以选择泊松圆盘采样等,采样需要知道采样范围即filter大小和采样数。用纹理坐标产生随机种子,可以保证每次采样结果不同。将采样结果对纹理坐标进行偏移。工业界通常的处理方式是先对shadow map稀疏采样,再在图像空间内对含噪声结果进行一步降噪,就可以获得比较好的结果。连续的稀疏采样会造成闪烁,因为帧与帧之间随机采样相互独立,引入的噪声不一样,连续播放时会闪烁。

VSSM

​ 在考虑加权的情况下,将filter内的每一个像素与着色点进行深度比较并且将结果相加平均,想知道在该范围内,有百分之多少的深度比着色点浅。

​ 首先是PCSS的第三步,也就是PCF操作,VSSM假设在这一步对shadow map采样时得到深度值样本大致服从正态分布,想要定义出这样一个正态分布,就需要事先求得样本的均值和方差。

​ 想要迅速得到一块区域内的平均值,可以使用mipmap。但是该方法不同层级间要做插值并且只适合正方形,因此误差较大,另一种方法是使用SAT.

​ 想要得到一块区域内的方差,可以使用如下公式,将期望(均值,即上一步得到的结果,因为范围内每个像素概率相同)转换成方差。如下方式除了记录深度,还需要记录深度的平方。可以将两个数据记录在r通道和g通道,从而避免使用两个纹理。

image-20230714161400809

​ 在得到了方差和均值后,即可得到filter范围内的正态分布分数pdf(z)。现在想知道深度取某一值z1时,有百分之多少的纹素深度比z1小,即左图灰色区域的面积。每一个值都会对应一个面积值,即右侧函数cdf(z)。然而获得积分值只能通过查表,使用c++的内置函数也非常麻烦。

image-20230714165617822
切比雪夫近似

​ 如下不等式可以作为约等式使用。即只需要知道方差和均值,即可得到x>t的概率。不等式不需要假设样本服从正态分布,也适用其他单峰函数。但其局限性在于x需要大于均值。在正态分布的情况下较好解决,但实际使用时不考虑太多。

image-20230714165911683

image-20230714170019993

过程如下:在生成shadow map时在通道存入深度值和深度值的平方,通过mipmap或者sat生成深度和深度平方的均值。在确定着色点在像素上对应的点后,取一定filter,在mipmap上采样一定范围内的均值,并计算方差,从而计算概率,得到过滤平均后的visibility。采样和硬件生成mipmap开销较小。不过在物体变动或者光源移动必须更新mipmap,或者每一帧下。

对于是PCSS的第一步,获得一定范围内,遮挡物的平均深度。例如在深度为7的着色点下,要求蓝色区域的均值zocc。(红色区域不是遮挡物,红色区域的平均深度时zuocc)

image-20230714183939094

满足如下等式:

image-20230714191216697

N1/N即P(x>t),可以通过切比雪夫公式计算。得到N1/N即可得到N2/N(1-P(x>t))。此时不知道zunocc。此处假设所有>t的深度值为t。因为一般阴影接收的地方是平面。(pcss更常用,因为更加能容忍噪声,有很多效果很好的降噪手段)

一块区域内的平均值

最简单的办法mipmap:快速、近似方形的范围查询。各向异性过滤

image-20230714194353020

小,可以

准确方式SAT:

利用前缀和思想,范围内求平均前先将范围内求和,如下是一维:

image-20230714194458942

二维情况(生成一个新矩形,大小与原图相同,每个元素都是从左上角加到该元素的值,只是累加可能会损失数值精度,可以得到任何范围大小内的综合):

image-20230714195036035

Moment shadow mapping

vssm的问题在于

不能假设竞态分布 简简单情况

image-20230714200113782

pcf

偏黑,阴影变白不行!

image-20230714200333681

镂空 接受物不是平面 超过均值才准

image-20230714200510680

MSM是为了避免分布描述的不准。其方法是使用更高阶的矩去描述分布。关于矩最简单的就是一个数的几次方,例如记录到x的四次方,即保留x的四阶矩。VSSM记录了深度和深度的平方,即使用二阶矩。使用更高阶的矩可以使得分布更加准确(证明过程复杂)。如果保留前m阶的矩,可以表示越阶函数,有2/m个台阶。例如使用z到z的四次方可以恢复出图中深绿的函数(一般使用4阶矩足够,但是恢复过程相当复杂)。得到的函数即cdf,可以发现与pcf得到的结果基本符合。(该方法增加存储量,但是工业界有方法可以存储,如一个32位float存储两个16位值,但不拆开无法插值,拆开后手动插值和计算机插值会有差别;对分布有更加精准的估计)

image-20230714201442307

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.

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信