自定义SRP(六)—— 阴影遮罩(Shadow Mask)
- 培训职业
- 2025-06-19 09:22:53
在自定义SRP系列的第六章中,我们专注于阴影遮罩(Shadow Mask),这是一种烘焙阴影与实时阴影结合的技术。通过烘焙阴影,我们可以克服最大阴影距离的限制,同时在近距离保留实时阴影的动态效果。Unity的Shadow Mask混合照明模式提供了两种选择:Distance Shadowmask和Shadowmask,它们使用相同的烘焙数据,但处理方式略有不同。
在Distance Shadowmask模式下,我们调整场景设置以区分实时阴影和烘焙阴影区域,确保结构内部部分的光照清晰。阴影遮罩烘焙的数据包含静态物体对全局光照的贡献,存储在红色通道中。光源的属性变化会影响烘焙的间接光照,但不影响烘焙的阴影部分。
在着色器中,我们引入ShadowMask结构来跟踪阴影遮罩的使用情况,包括烘焙状态和模式。Shadows类负责检测光源并启用相应的着色器关键字。Unity通过unity_ShadowMask纹理和采样器状态将烘焙的阴影数据传递给着色器。
动态对象使用光照探针而非光照贴图,但Unity会烘焙阴影遮罩数据到光照探针中。为了实现阴影遮罩在动态对象上的正确应用,我们调整了SampleBakedShadows函数和Unity渲染设置,确保遮挡数据被正确发送到GPU。
混合烘焙阴影和实时阴影时,我们编写了函数来决定何时使用哪种阴影。随着深度变化,阴影从实时过渡到烘焙,实现平滑的阴影效果。对于多光源场景,我们处理了遮罩通道选择和光源转换的问题,以确保烘焙阴影的正确分配。
最后,减法照明模式在本教程中不被讨论,因为它要求更复杂的配置和限制。而对于空间有限的情况,始终阴影遮罩模式是更好的选择。
多重随机标签