Unity实时阴影技术(shadowMap)

实时阴影技术

1.Planar Shadow

2.Projector Shadow

3.ShadowMap(CSM ,PCF)

1.Planar Shadow

原理就是将模型压扁之后绘制在需要接受阴影的物体上,这种方式十分高效,消耗很低。具体实现过程参考Unity Shader - Planar Shadow - 平面阴影。按照自己的理解,其实就是根据光照方向计算片元在接受阴影的平面上的投影位置,然后绘制即可,这种方式还是只适合在平面上绘制阴影。

2.Projector Shadow

对于Projector Shadow的实现原理可以参考Unity - Projector - 实时阴影这篇文章,这里简单做一下总结。
Projector Shadow是常用的实时阴影实现方式,其基本原理是通过摄像机将需要显示阴影的物体,渲染到一张RenderTexture(RT)上,记录下物体的颜色值(可设置为自定义颜色),并将RT关联到Projector组件的材质上;然后通过Projector组件将需要接收阴影的物体以Projector组件的材质再渲染一遍来实现阴影的显示。

3.阴影映射纹理——ShadowMap(CSM,PCF)

用一句话形容ShadowMap原理,光源看不到的地方就是阴影。
渲染场景时用LightMode为ShadowCaster的Pass渲染一张ShadowMap(本质就是一张深度图),这个Pass的渲染目标不是帧缓存,而是ShadowMap。

光源的ShadowMap
光源的ShadowMap

  • 在传统的ShadowMap实现中,会在正常渲染的Pass中将顶点位置变换到光源空间中,使用其xy分量对ShdowMap进行采样,将得到的深度与该顶点的深度信息(由z分量得来)比较,若小于,则该点处于阴影中。

  • Unity5中使用了屏幕空间的阴影映射技术(ScreenSpace ShadowMap),在Light Mode为ShadowCaster的pass中分别得到摄像机的深度纹理和光源的ShadowMap,从而得到一张屏幕空间的阴影图,通过对这张阴影图采样,就可以得到对应的阴影效果。(具体来说,从摄像机深度纹理中的深度值得到对应片元的世界坐标,再把其坐标从世界空间转换到光源空间中,和光源的ShadowMap中的深度比较,进而得到该片元是否位于阴影中。)

  • 弊端 1.在较大的场景当中,使用同精度的ShadowMap,相机近端和远端物体对阴影图采样精度一样,会导致近端物体采样精度不够,远端物体采样精度浪费。2.由于ShadowMap的算法只是非常暴力的比较深度值,所以得出的阴影效果就较为生硬,边缘较为生硬,且存在锯齿。

  • CSM级联阴影技术(Cascaded Shadow Mapping)
    CSM通过把相机的视锥体按远近划分为几个级别,处于各个级别下的物体深度信息绘制到各级阴影图中,显示时采样各自对应的阴影图。具体实现可参考Unity实时阴影实现——Cascaded Shadow Mapping

  • PCF软阴影 在硬阴影中讲到比较该点的深度和光源的深度图中的深度进行比较,若不匹配说明有遮挡(为阴影区域),否则为可见区域。在这里我们不仅仅找该点的深度,在shadow map上还要找该点周围的点的深度。
    1.假设这里取3X3的区域。
    2.将区域内的每一个点的深度与该点(中心点/投影的点)的深度进行比较(每次比较后的值为1 or 0 ,1为小于该点的深度(可见),0为大于该点的深度(不可见))。
    3.进行比较后将比较后的值平均起来为0.667。
    关于PCF软阴影的更多实现可参考软阴影(PCF、PCSS)

  • Unique Character Shadows 这项技术主要用于角色的刘海,衣服等自身的阴影渲染,这些阴影对质量要求很高,一般会为角色单独渲染一张ShadowMap。在这里插入图片描述

  • 静态逐对象阴影(Per Object ShadowMap) 不需要实时改变阴影的物体使用,为物体单独存一张ShadowMap。在Unity的HDRP管线中实现。

猜你喜欢

转载自blog.csdn.net/qq_53057269/article/details/127439110
今日推荐