Cascaded Shadow Map(CSM)是目前引擎中主流的阴影技术,效率与效果均不错。它与传统的单张Shadow Map的区别主要在于将视锥体进行了层次的分解,每一层单独计算相关的SM,这样在渲染大场景的阴影就可以避免传统的SM的各种缺点。典型的CSM原理基本上如下图所示:

虽然看起来原理简单,但是在实际中想实现一个健壮的CSM并不容易,涉到各种问题,其中一些是这种方法本身就固有的,需要使用多种手段来解决或规避。

1. 计算紧密的投影矩阵

为了提高SM的有效利用率(也即是要在生成的SM中尽量减少无关区域的面积),需要尽量减小生成SM时所使用的投影矩阵,这样就需要计算出在当前Cascade下所对应的Frustum的较为紧密的投影矩阵。这一般是在光源空间下计算出视锥体所对应的AABB包围盒:

不过这样直接使用AABB会带来另外一个问题,由于Camera的属性会实时改变,因而其对应的Frustum的属性也会不断改变,而AABB对Frustum的变化又较为敏感,这样就可能出现前后两帧中Frustum所对应的AABB变化巨大,进而导致生成的SM的有效分辨率(是指对于某一固定物体来说的其投影到SM中后所占用的pixel的数量,SM的大小并不变化)可能在连续两帧中出现突变,这样就会出现阴影的抖动(Flickering)的问题。关于这个问题有论文(Stable Cascaded Shadow Maps)提出了使用Sphere来代替AABB的解决方法,因Sphere对Frustum变化的敏感性相对较低,这样一定程度上会解决抖动的问题。更好的解决方法是在Shader X7中的Practical Cascaded Shadow Maps中提到的渐进式变换Frustum的方法,而且也能同时在一定程度上解决Rasterization所带来的抖动问题。

2. 计算优化的远近裁剪平面

由于Shadow Map在使用时对Z值的精度较为敏感,因而也就需要在生成SM时尽可能提高有效Z值的精度,这就引出了另外一个问题:那就是在生成SM时使用较为优化的远近平面。这里的首要原则是使用保守的方法来尽可能得到相对优化的的远近平面,太过于激进的方法容易过多地裁掉物体进而造成阴影漏洞。不能简单使用光源视锥体所对应的AABB来计算远近平面,这样当场景过大时会使用漏掉近平面以内的一些物体。更为合理的方法是使用两端扩展的光线视锥体来与场景求交计算出合理的远近平面。

3. Cascade间的冗余物体剔除

一般来说需要将使用CSM时需要将View Frustum分割为若干个Cascades,而且大多数情况下光源的方向与View的方向并不垂直,这样一来就会在渲染每个SM时可能会出现Light所对应的视锥相互交叠的情形,这样就导致了重叠部分的几何体元被重复绘制,如下图所示:

这种情况下可以选择对两者重叠的部分进行剔除,以便减少需要绘制的几何体元的数量来提高SM的生成速度。但是这里要注意:如果使用带有剔除的SM生成方法的话则需要在SM的查找时使用Map-based cascade selection的方法来选择最为合适的SM,而不能使用基于Split索引的方法直接定位当前Pixel到其所在的SM上,否则会出现阴影的漏洞。另外,还需要对每个层级上的光源视锥的远平面进行调整以便其可以包含到下一层级中的一些物体,否则就会出现一些Pixel定位到上一层级的SM 上,但其中并没有生成实际包含在下一层级的视锥体中的物体,这样同样会漏掉一些阴影。

关于CSM,与D3D SDK中的示例相结合的两篇文章很不错:Cascaded Shadow Maps,Common Techniques to Imporve Shadow Depth Maps;另外,还有Shader X6中的Stable Cascade Shadow Map以及X7中的Practical Cascade Shadow Map。最后一篇论文中总结了CSM多个方面的优化问题(比如Shadow Map的Pack等),很不错。

Cascaded Shadow Map(CSM)中的一些问题相关推荐

  1. 联级阴影贴图CSM(Cascaded shadow map)原理与实现

    联级阴影贴图CSM(Cascaded shadow map)原理与实现 CSM是利用分层的ShadowMap技术,实现大场景的阴影算法.示意图如下图: 我们通过给眼视锥分片,为每个分片生成一个相同分辨 ...

  2. Shadow Map阴影贴图技术之探 【转】

    这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本 ...

  3. Shadow Map 原理和改进 【转】

    http://blog.csdn.net/ronintao/article/details/51649664 参考 1.Common Techniques to Improve Shadow Dept ...

  4. 所有的shadow map的名称

    本贴内容转自http://hyzgame.blogspot.com/2009/04/sm.html,一位网友列出的他搜到的所有的shadow map的名称,挺好,方便大家查找,复制到这里.现在TSM似 ...

  5. [工作积累] shadow map问题汇总

    1.基本问题和相关 Common Techniques to Improve Shadow Depth Maps: https://msdn.microsoft.com/en-us/library/w ...

  6. Vulkan Cascade Shadow Map的故事

    你只需做你自己,做你想做的事,不要沦为人海中的沧海一粟. --<沉默的多数派> 序 最近几周,看了看知乎上关于阴影的文章,虽然我记得大二的时候好像也看过那本<Unity Shader ...

  7. Unity实时阴影实现——Cascaded Shadow Mapping

    前言 Unity内置的方向光实时阴影技术是Cascaded Shadow Mapping(简称CSM). 由于Unity封装的原因,可能并不能满足实际项目实时阴影的需求,但我们可以从Unity开源出来 ...

  8. Render Flow of Divinity II (part 2 shadow map)

    Render Flow of Divinity II (part 2 shadow map) 作者:clayman 仅供个人学习使用,转载请保留作者以及原文链接,勿用于任何商业用途. 上一篇文章介绍了 ...

  9. CSM中一些常见问题的解决方式

    CSM中一些常见问题的解决方式 抖动 摄像机在每帧移动或者旋转时,会产生较严重的抖动问题.抖动我们可以分为平移抖动和缩放抖动. 平移抖动: 我们在平移摄像机时会产生的抖动: 我们关闭PCF,并减小深度 ...

最新文章

  1. linux进程--写时拷贝技术copy-on-write(七)
  2. 标记语言 编程语言 脚本语言分别有哪些? 区别是什么?
  3. 新版上线时发现的数据库优化问题
  4. Java IO流读取文件
  5. JAVA入门级教学之(switch语句)
  6. 删除Github上项目
  7. 现代通信原理思维导图--第二章 确知信号
  8. 《Redis开发与运维》- 核心知识整理二(Lua脚本、发布订阅、客户端等)
  9. java读取文件的万能解决方案
  10. linux下word转pdf
  11. word小技巧 将图片批量居中
  12. QCustomPlot之光标划过曲线显示点的坐标
  13. GPU 编程 CPU 异同点_22年后再战显卡市场 分析师:英特尔GPU不会构成威胁
  14. oracle 查询时间段内的天,ORACLE任意时间段内所有天数日期查询
  15. java实现pdf电子合同设置合同编号
  16. ecb里使用自定义快捷键切换窗口
  17. PS流(ISO13818和GB28181)分析
  18. 在gerrit上cherry pick多笔提交到一个仓库中
  19. uml通信图画法_[UML]UML系列——协作图(通信图)collaboration diagram
  20. 计算机速算训练,5种速算技巧,比计算机“更神速”!值得收藏!

热门文章

  1. 问题 I: 自然数拆分Lunatic版
  2. MySQL 8.0.20 Window10免安装版配置及Navicat管理
  3. 第三期私域运营白皮书(下)
  4. UltraISO 绿色多国语言版
  5. 汽车配件销售管理系统毕业设计
  6. prometheus 钉钉告警
  7. Easier UVM Coding Guidelines / 便捷UVM 编码指南
  8. android博客排行榜,新浪博文排行_新浪博客 新浪博客Android客户端
  9. 学术期刊划分(SCI、EI、SSCI、IEEE、CSSCI等)
  10. IOT-OS之RT-Thread(十三)--- 网络分层结构 + netdev/SAL原理