【Unity——Screenspace Shadow Map与传统Shadow Map】

文章目录

一.Screenspace Shadow Map技术与传统Shadow Map技术区别
二.Screenspace Shadow Map简介
2.1Screenspace Shadow Map概括
2.2UpdateDepthTexture
2.3RenderShadowMap
2.4CollectShadows

一.Screenspace Shadow Map技术与传统Shadow Map技术区别

《Unity Shader入门精要》中P197页对二者的阐述如下
●传统Shadow Map
在传统的Shadow Map实现中,会在正常渲染的Pass中将顶点位置变换到光源空间中,使用其xy分量对ShdowMap进行采样,将得到的深度与该顶点的深度信息(由z分量得来)比较,若小于,则该点处于阴影中。
●Screenspace Shadow Map
Unity5中使用了屏幕空间的阴影映射技术(ScreenSpace ShadowMap),在Light Mode为ShadowCaster的pass中分别得到摄像机的深度纹理和光源的ShadowMap,从而得到一张屏幕空间的阴影图,通过对这张阴影图采样,就可以得到对应的阴影效果。

二者的区别可以概括为:
Screenspace Shadow Map会先计算所有的阴影结果,并将这些结果保存在一张屏幕空间的阴影纹理中,在渲染某个物体时,如果其开启了接收阴影选项,其阴影来源于对这张屏幕空间阴影纹理的采样。而传统Shadow Map技术不会提前计算这张屏幕空间的阴影纹理。渲染某一物体计算其接收的阴影时会在其正常Pass中遍历所有片元,依次与ShadowMap进行比较判断该片元是否在阴影中。

二.Screenspace Shadow Map简介

2.1Screenspace Shadow Map概括

根据帧调试器以及书中内容,Screenspace Shadow Map主要的渲染事件以下
1.UpdateDepthTexture,更新摄像机的深度纹理
2.RenderShadowMap,渲染得到阴影映射纹理ShadowMap
3.CollectShadows,根据深度纹理与阴影映射纹理计算得到屏幕空间阴影纹理
4.绘制最终渲染结果
在这里插入图片描述
各个步骤的结果如下在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2UpdateDepthTexture

场景中主要有三个物体
地板平面plane ——shader:内置Standard
右侧立面plane(1)——shader:内置Standard
立方体Cube——自定义Shader:shadow
Unity分别调用Standard shader和shadow shader中的名为ShadowCaster的Pass为plane plane(1)和Cube计算DepthTexture。
在这里插入图片描述
在这里插入图片描述
当注释shadow shader中的FallBack “Specular”语句,场景发生了变化
1.帧调试器中,UpdateDepthTexture一步不再有上图中Draw Mesh Cube一步
1.Cube无法进行投射与阴影接收,并且产生了阴影透视效果
见下图在这里插入图片描述
在这里插入图片描述
那么,名为ShadowCaster的Pass从何而来?
根据Unity官方文档的描述,FallBack时Unity无法在当前的显卡配置条件下找到合适的Shader时才会选择的shader。不过在计算阴影的时候,当无法在当前Shader中找到合适的ShadowCaster时,Unity会从FallBack中挑选出一个默认的ShadowCatser。
《Unity Shader入门精要》P33:“在渲染(阴影映射纹理)时,Unity会在每个Unity Shader中寻找一个ShadowCaster的Pass。通常情况下我们不需要专门实现一个Pass,因为FallBack使用的内置Shader中包含了这样一个通用的Pass”

值得一提的是,无论Cube是否投射/接收阴影,都不会影响其DepthTexture的计算。
如果关闭Cube的投射阴影与接收阴影,还是会为其进行DepthTexture的计算

2.3RenderShadowMap

这一步同样是调用了shader中名为ShadowCaster的Pass为物体计算阴影映射纹理。
《Unity Shader入门精要》P198提到,开启投射阴影,Unity就会把物体加入到光源的阴影映射纹理的计算当中。在此再次举例验证。
选择开启Cube的投射阴影,在帧调试器中可以看到Unity将其加入了阴影映射纹理的计算。如下图
在这里插入图片描述
如果关闭Cube的投射阴影,结果如下
在这里插入图片描述

2.4CollectShadows

请直接看作者的博客,在此不要脸地直接截图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_62316271/article/details/128519219