课程资源
GAMES202_Lecture_03.pdf
点击查看【bilibili】
课程内容
PCSS的原理以及实现
个人理解就是一个根据远近程度自适应调节PCF大小的映射方法
什么是Shadow Mapping(SM)
一个两趟的在图像空间的算法
Light Pass
从光源向场景看——记录其深度值,得到一张texture
Render Pass
从相机的位置出发,渲染一遍整个场景
缺点:
自遮挡现象,有明显锯齿,会走样,阴影很硬
Shadow Map原理图
在Render Pass时渲染每个像素的时候,对每个着色点进行一次朝向光源的求交
- 如果中间没有任何遮挡物,则texture中记录的最浅深度就是当前像素的深度;
- 如果中间有遮挡物,则当前像素处在阴影里
Shadow Map效果图
如果从Light出渲染图片,会得到
而倘若只记录其深度图,会得到
Shadow Mapping的缺点
重点关注地板上的奇怪纹路——并不是摩尔纹,原理上也不是因为采样率不足造成的
是由于光线由像素投射出去以后所记录的深度并不连续,会造成断层,又因为光源和摄像机之间存在夹角,该夹角会使得片元间存在自遮挡现象
当光源方向与所照射表面平均法向平行的时候(垂直照射表面)上述效应将不明显
当光源方向与所照射表面平均法向垂直的时候 上述效应将非常明显
**导致bias的原因有两个,数值精度原因和几何原因,数值精度就是说因为shadow map 的分辨率和存储depth的precision精度不够。几何原因是因为shadow map中的一个texel投影到camera view space场景中会是一个有面积的部分,这个部分会覆盖好几个场景中的fragment或sample,导致这些不同的fragment或sample会获取到相同的shadow map深度值。 **
如何补偿ShadowMapping的奇怪纹路
加入一个shadow bias(阴影偏离值)
**就是简单的给shadow map中的z值加上一个偏移值,让这个值变小一点,偏离要渲染的平面一点,这样要渲染的平面就会都处于光照下,不会出现一部分在shadow中一部分在light中了。 **
但同时也引出了新的问题
阴影出现了奇怪的断层,是因为bias选取了一个定值,将近处的物体和远处的物体等同来看待。要解决这个问题可以从自适应Bias的选取入手。
学术界提出了第二种解决方案
记录多个shadow texture——不止记录从光源看场景的最浅深度,并且记录第二浅,第三浅的shadow texture
但是不会在工业中使用。
实时渲染不相信算法的复杂度!
补偿Shadow Mapping的走样现象
在工业界主要使用cascade shadow map(级联阴影)
原理是根据阴影投射平面自适应阴影的分辨率
什么是Percentage closer soft shadows(PCSS)
在实时渲染中,我们可以将不等式看做在某些约等看做是近似相等,来使用
其实上式 左边到右边的意思就是,对于一个面积分来说,倘若被积函数可以拆成两项,那么我们就可以将其中复杂、不好积分的一项单独拎出来积分,用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTtJC3hK-1650090302468)(https://cdn.nlark.com/yuque/__latex/50bbd36e1fd2333108437a2ca378be62.svg#card=math&code=f%28x%29&id=V1dbY)] 的面加权均值代替原先被积函数中的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5aKg17O-1650090302469)(https://cdn.nlark.com/yuque/__latex/50bbd36e1fd2333108437a2ca378be62.svg#card=math&code=f%28x%29&id=gRjID)]。
什么时候是可接受的
- 当积分域比较小的时候,上述近似不会和原先结果有特别多的偏差
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B6HbrmwP-1650090302469)(https://cdn.nlark.com/yuque/__latex/e84fec1e074026d6fa8e3155482c35c3.svg#card=math&code=g%28x%29%0A&id=AgdlM)] 函数较光滑的时候,结果较为准确
个人理解:对于上述的两个限定条件,当积分域较小的时候,用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TxgQqQoS-1650090302470)(https://cdn.nlark.com/yuque/__latex/50bbd36e1fd2333108437a2ca378be62.svg#card=math&code=f%28x%29&id=d178y)]的加权均值来代替[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzpaiKrp-1650090302471)(https://cdn.nlark.com/yuque/__latex/50bbd36e1fd2333108437a2ca378be62.svg#card=math&code=f%28x%29&id=P5EqE)]不会产生太大的偏离;当[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ZAZnXDA-1650090302472)(https://cdn.nlark.com/yuque/__latex/e84fec1e074026d6fa8e3155482c35c3.svg#card=math&code=g%28x%29%0A&id=Fk86K)]较为光滑的时候,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gP0KqOF1-1650090302472)(https://cdn.nlark.com/yuque/__latex/50bbd36e1fd2333108437a2ca378be62.svg#card=math&code=f%28x%29&id=uBq0W)]的加权均值的误差不会被[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNJK8JjO-1650090302473)(https://cdn.nlark.com/yuque/__latex/e84fec1e074026d6fa8e3155482c35c3.svg#card=math&code=g%28x%29%0A&id=IfZ7n)]放大太多。
在shadow mapping中的使用
在上述的BRDF’中,原本上我们是需要对原先要逐顶点计算的光照,现在直接将可见项部分提出,用可见项的平均值来代替原先的积分表达式中的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NMR3uNho-1650090302474)(https://cdn.nlark.com/yuque/__latex/6b36228d6f0c448cdb1b33d9309af758.svg#card=math&code=V%28p%2C%5Comega_i%29&id=m4rtC)],从而达到简化运算的作用。
同时在针对是否可以接受的问题,我们发现只要选取的积分域比较小或者计算的光是漫反射的时较为可接受其误差。
从硬阴影到软阴影
软阴影会随着投射面距离的遥远阴影逐渐模糊,从有阴影到没有阴影中间存在半阴影。
Percentage Closer Filtering ( PCF )
阴影的加权平均的卷积核(过滤器)
最初是用来做抗锯齿和反走样的,但人们发现他可以柔化阴影的边界
原理
PCF并不是直接对于Shadows Map直接进行过滤
而是在计算着色点阴影时,对深度图上对应阴影处的像素周围小块面积的深度进行加权平均,作为原先那个像素的深度值
对有锯齿的阴影做加权平均仍然会有锯齿产生
正确过滤之后阴影的效果
过滤器的大小对软阴影不同的表现
现实生活中的阴影情况
距离遮挡物越近的阴影越硬,越远的越软。
我们发现接受光源的点和Blocker depth有关,在这个投射关系中,很容易能找到相似三角形
- 从着色点处连向点光源,取着色点周围的一圈点,取他们Blockers(遮挡物)的平均作为那个点的Blocker。
- 用平均深度确定PCF的大小
- 用PCF进行软化阴影
现在问题转化到如何选取着色点的Blocker?
- 取一个固定大小的范围
- 再次使用相似三角形
方法是:
考察blocker是如何截取着色点连向光源的圆锥,获取截取面积中的遮挡物的平均深度
但在实际过程中开销是非常大的,工业界会有很多的加速方案,放在下一讲再说。
软阴影实例
树根阴影比较锐利
树冠阴影比较柔和
符合实际规律!
课程内容到此结束!