Shadows实时阴影原理

一、Shadows Mapping

最主流的阴影算法,分俩趟Pass渲染。

1.第一个Pass:从光源Light射出方向出发,记录到达像素(片元)最浅的距离

在这里插入图片描述
得到一张Texture,也就是深度图:0-1 黑-白 物体离得越近越黑。
在这里插入图片描述

2.第二个Pass:从眼睛(摄像头)看向方向出发,渲染场景得到像素(片元),如片元A

在这里插入图片描述

计算这些片元(如A)到光源的距离:黄线,和Pass1的距离一样,说明光源可见 A没有被遮挡,没有阴影。
在这里插入图片描述

如果片元A到光源的距离,黄线比在Pass1深度图记录的距离(B到光源)更远,则说明片源A被遮挡,A处有阴影。
在这里插入图片描述

二、Shadows Mapping 由于数值精度会出现的问题 Shadows Bias:

在这里插入图片描述
由于光源离地平线越近,光源到像素的距离1和摄像头到像素的距离2就会不一致,地面就会出现类似摩尔纹的阴影错误。
在这里插入图片描述
通常可以增加一个根据角度改变的偏移距离Bias值来解决摩尔纹的阴影错误。
但如果Bias过大就会又出现如图脚步阴影悬空的问题。(也叫彼得潘),工业界一般靠调整Bias值来大体解决这个问题。

三、阴影抗锯齿Percentage Closer Filtering (PCF)

PCF总体上就是从原来的和P点比较变成了和P点周围比较再做平均值,就是一种模糊。
在这里插入图片描述
具体在(一.2)这个步骤,即“如果片元A到光源的距离,黄线比在Pass1深度图记录的距离(B到光源)更远,则说明片源A被遮挡,A处有阴影。”
比较距离时不再只和深度图的一个点做比较,而是和这个点周围如3x3范围的每个点(片元)做一个平均或加权过滤(Filtering),这样的结果就是消除了阴影边缘的锯齿。
在这里插入图片描述

四、实现软阴影 Precentage closer soft shadows (PCSS)

在这里插入图片描述
对于阴影我们观察到一个现象:阴影离投射物越远,阴影越浅。反之离投射物越近,阴影越硬,如笔尖。
在这里插入图片描述
总的来说,PCSS就是用PCF的做法 调大Filer size实现的软阴影。
从以上观察我们知道阴影的深浅和遮挡物到阴影的距离即dReceiver的距离相关,越近阴影越深。
1.绿色Blocker为遮挡物。
2.W灰色为阴影,它的大小和绿色遮挡物Blocker的距离成远大近小:
相似三角形计算公式: W灰色:W黄色 =(d蓝色-d绿色):d绿色

Filer的大小就取决于W灯光大小和dBlocker距离。
在这里插入图片描述
如上图,PCSS分三步:
1.计算遮挡物P周围范围平均深度
2.用这个平均深度估算出第3步在P周围应该Filer size 多大
3.用这个Filer size 进行PCF计算(本质上就是确定P范围区域内有百分之多少比P点深度浅),从而得出0~1间数值的软阴影。

四、基于方差的软阴影 VSSM

PCSS中第1步和第3步计算量超大非常消耗性能,所以人们又提出针对这两步优化的软阴影算法VSSM:
在这里插入图片描述
在这里插入图片描述
我们可以近似认为P点在其周边范围的深度排名符合正太分布,所以问题演化成了求期望和方差(二者可确定正太分布图)
在这里插入图片描述
求期望:
方法1:MipMap 但只能求近似
方法2:SAT 二维前缀和 精确

求方差:
如图公式,X的方差=等于X平方的期望E - X期望E的平方

期望E上述SAT已求得,X的平方可将深度图数值的平方预计算存入贴图RGB的另一个通道。

小总结:

VSSM虽然很巧妙但不够精确,随着对图像空间降噪的处理手段越来越多,如TAA等,PCSS现在又回归成了软阴影的主流。

五、距离场软阴影 SDF Soft Shadows

在这里插入图片描述
Signed Distance Field(SDF)有向距离场:定义场景中矩阵任意一点到物体的最小距离,有向用正负表示在物体内外。
在这里插入图片描述
软阴影可以看作是从Shader Point出发看向面光源,有多少面光源被遮挡。
我们可以用SDF的范围来近似的得到大概有多少光源被挡住,从而确定软阴影的0~1。
注意,即使是点光源也是有发光范围的。实际中我们通过确定Shader Point被遮挡的角度来确定软阴影的0~1黑度。
在这里插入图片描述

posted @   Cxihu田树东  阅读(90)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2022-11-15 Unity高性能无卡顿取图像——实时推流/截屏录屏等功能
点击右上角即可分享
微信分享提示