阴影是怎么产生的,如何渲染出阴影
Shadow Mapping 假设要渲染以下场景 渲染场景2次: 1.第一次,产生一个shadow map,shadow map描述光源能照到的着色点. ![在这里插入图片描述](https://img-blog.csdnimg.cn/6ec4dd1cf1be42a6b0e978f1903cd3b0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZJUENDSg==,size_16,color_FFFFFF,t_70)
2.从眼睛出发,从第一次渲染 shadow map中,看某个点是否在阴影里. 3. 再次渲染,我们渲染一个结果,比较深度。 好处:不再需要知道场景的几何信息 坏处:走样和锯齿
Shadow Mapping 的问题
问题一:渲染结果自遮挡 原因:我们对每一个场景的像素的深度,这个值是固定的。Shadow Map记录的深度不连续。且光线和场景的像素有夹角,也就是斜着照到像素上,Shadow Mapping 就会出现自遮挡现象。 解决方法: 如果光线打到像素上的时候夹角很大,我们Shadow Map中记录的深度和计算的深度加上偏移。光线和和着色点法线的夹角越大,偏移值越大。 问题二:引入问题一的方案后阴影不全 问题三:走样 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0bda2dc4765540c193731df581b83721.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZJUENDSg==,size_16,color_FFFFFF,t_70)
如何渲染出好的阴影
预备知识:不等式 我们在实时渲染中,会把不等式在一定条件下,当做约等于用。 乘积的积分和积分的乘机近似:
以上不等式什么时候可以近似相等: 1.实际的积分范围很小的时候,可以近似. 2.g(x)在积分域的范围内变化不大(min,max差别不). 1.面光源,光源没有什么变化 2.BRDF是一个diffuse的材质![在这里插入图片描述](https://img-blog.csdnimg.cn/86bd415958744a3db0e7384b5cec88f0.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1ZJUENDSg==,size_16,color_FFFFFF,t_70)
PCSS算法(产生软阴影的方法)
Percentage Closer Filtering(PCF)** 第一:不是对已经存在的阴影做Filter 第二:不是对ShadowMap做Filter PCF算法: 硬阴影:对任意一个着色点,计算它的阴影时候。比较shadow map中点和这个点的深度,看是否在阴影里。这种方式某个点的阴影只有0和1两种结果,也就是在阴影里面,或者不在阴影里面。这种方式产生的阴影叫做硬阴影 软阴影: 如果我们需要软阴影,那么我们这个点(某个着色点)需要和shadow map中的一个点比较。同时和shadow map中这个点附近的 7 * 7(除去该点)个点比较深度。那么我们得到了很多49个值(这些值是0或者1) 加权平均,就得到了一个在0~1之间的数值。那么这个值就可以代表阴影有多"软",越接近0,越软,越接近1,越硬。 PCF的效果: 什么时候是软一些,什么时候硬一些 Percentage Closer Soft Shadows (PCSS)** 距离遮挡物越近,阴影越硬,距离遮挡物越远,阴影越软。我们需要计算一个相对的平均的遮挡物和阴影的投射物之间的距离。 下图是光线,遮挡物(Blocker),阴影接收物(Receiver)和阴影的软硬关系。我们用这个计算的结果来确定过滤时候的核多大。PCF算法中 77 还是 33。 算法的核心: 第一步:记录一个shading point的遮挡物的平均深度(计算多大的区域内遮挡物?) 第二步:计算Filter的大小 第三步:PCF算法 找多大的区域?在着色点,连向光源,形成一个椎体,在这个椎体中去找blocker,再去找平均深度。 截图和公式来源闫令琪老师games202课程 感谢闫令琪老师为我们带来这么精彩的图形学课程 https://www.bilibili.com/video/BV1YK4y1T7yY?p=4&spm_id_from=pageDriver
|