
1. 项目概述Cocos Creator阴影系统的选择困境在Cocos Creator里做3D项目尤其是涉及到角色、场景交互的时候阴影绝对是个绕不开的话题。它能让你的场景从“纸片感”瞬间变得立体、真实但处理不好它也能让你的项目帧率暴跌或者出现各种奇怪的“穿帮”效果比如阴影悬浮、边缘锯齿严重、物体自阴影漏光等等。我见过不少项目前期为了快速出效果随便选了个阴影类型结果到了中后期优化阶段性能瓶颈卡在这里想改又牵一发而动全身非常头疼。Cocos Creator 3.x版本主要提供了两种阴影方案Planar Shadow平面阴影和Shadow Map阴影贴图。官方文档虽然列出了它们的参数但“什么时候该用哪个”、“各自的坑在哪里”、“怎么调参才能既好看又流畅”这些实战中的关键问题往往需要踩过坑才能明白。这篇文章我就结合自己多个项目的实际经验帮你彻底理清这两者的区别并附上详细的避坑指南和调优技巧。无论你是刚接触3D渲染的新手还是正在为项目阴影优化发愁的老手希望这篇指南都能给你带来直接的帮助。2. 核心原理与适用场景深度解析2.1 Planar Shadow轻量高效的“投影仪”Planar Shadow中文常叫平面阴影或投影阴影。它的原理非常直观想象你有一个手电筒光源和一个剪纸人偶模型你把光打在人偶上然后在它下方的地面上一个预设的平面就会投出一个黑色的影子。在计算机图形学里这个“投影”过程是通过一个简单的投影矩阵计算实现的。核心计算逻辑引擎会将模型的所有顶点沿着光源方向“压扁”到你指定的那个接收平面上。这个过程不涉及任何额外的纹理渲染纯粹是顶点变换。因此它的开销极低性能表现非常出色。最适合它的场景地面平坦的竞技场/跑酷游戏比如一个足球场、一个平坦的赛道所有角色和物体的阴影都投射在唯一的地面上。UI/特效中的伪3D阴影一些技能特效、UI弹窗需要快速的阴影效果来体现层次感Planar Shadow是首选。移动端性能敏感项目当你的目标机型是中低端设备且场景符合“单一接收面”特性时Planar Shadow能帮你省出宝贵的GPU时间。它的致命局限只能投射到一个平面这是最核心的限制。如果你的场景有楼梯、斜坡、多个不同高度的平台Planar Shadow无法让阴影“爬”上这些斜面它只会统一投射到那个设定的“地面”上导致阴影穿模非常不真实。不支持物体接收阴影一个箱子的阴影无法投射到另一个箱子上。阴影只存在于你设定的那个接收平面。阴影质量固定阴影的边缘是“硬”的没有渐变过渡。虽然可以通过调整ShadowColor的透明度Alpha值来模拟半影效果但本质上还是硬阴影。实操心得不要试图用多个不同角度的Planar Shadow去模拟复杂场景这会让管理和调试变得异常混乱。记住它的定位单一平面、高性能的解决方案。2.2 Shadow Map追求真实的“光影雕刻家”Shadow Map是当前3D游戏实现动态阴影的主流技术它的原理更像是在光源位置放了一台“隐形相机”。核心工作流程生成阴影贴图以光源如平行光为视角渲染一次场景。但这次渲染不输出颜色只记录每个像素距离光源的深度值生成一张深度纹理这就是“Shadow Map”。正常渲染场景从玩家相机视角正常渲染场景。对于屏幕上的每一个像素片段我们将其坐标转换回刚才那个光源的视角空间。深度比较比较这个像素在光源视角下的深度值和Shadow Map中对应位置存储的深度值。如果像素深度 Shadow Map深度说明这个点被其他物体挡住了在阴影中。反之则被光源直接照射。它的强大之处真实性阴影可以正确投射到任何几何表面包括凹凸不平的地形、其他物体的侧面完美解决Planar Shadow的局限性。支持自阴影物体自身的不同部分可以相互产生阴影如角色的手臂在身体上投下的影子这是提升真实感的关键。可调质量通过调整ShadowMapSize贴图分辨率和Pcf过滤等级可以在性能和效果之间取得平衡。它带来的挑战性能开销大每帧至少需要多一次或多个光源多次完整的场景渲染深度Pass来生成Shadow Map。分辨率越高开销越大。视觉瑕疵Shadow Map技术本身会引入一些经典问题阴影锯齿因贴图分辨率不足阴影边缘出现像素化的“楼梯”状锯齿。阴影悬浮/彼得潘现象因深度比较的精度问题阴影看起来没有紧贴地面像飘起来一样。需要通过Bias深度偏移参数来修正。自阴影漏光在弯曲表面由于同一个纹素覆盖了多个深度值可能导致不应该被遮挡的区域错误地进入了阴影或反之。需要通过NormalBias法线偏移来缓解。2.3 决策矩阵我该用哪个你可以通过下面这个快速决策表来做出选择特性维度Planar ShadowShadow Map选择建议性能开销极低中到高移动端或低配Web项目优先考虑Planar。场景复杂度单一平坦接收面任意复杂几何表面场景有高度变化、斜坡、多个物体堆叠必须用Shadow Map。阴影质量硬阴影边缘锐利可调软硬边缘PCF追求高质量视觉表现选Shadow Map并开启PCF。动态光源光源移动需重新计算投影矩阵但计算量小光源移动需重新生成Shadow Map开销大如果光源如手电筒频繁移动需谨慎评估Shadow Map的性能。实现复杂度简单参数少复杂参数多需精细调节项目初期快速原型可用Planar最终品质项目需攻克Shadow Map调参。平台兼容性几乎100%兼容依赖浮点纹理支持极低端设备可能需开启Packing有质量损失面向超低端设备如部分老旧浏览器需测试Shadow Map兼容性。一句话总结要性能、场景简单选Planar要真实、场景复杂咬牙上Shadow Map并做好调优。3. Planar Shadow 配置详解与避坑指南虽然Planar Shadow简单但配置不当也会出现奇葩问题。我们一步步来看。3.1 基础配置步骤启用场景阴影在层级管理器选中Scene根节点在属性检查器中找到shadows组件勾选Enabled。配置阴影平面这是最关键的一步。shadows组件的Normal和Distance共同定义了这个“地面”。Normal平面的法线方向。默认是(0, 1, 0)即平面朝上Y轴正方向这是我们最常见的地面。如果你的地面是倾斜的就需要修改这个值。Distance平面沿法线方向到世界坐标系原点的距离。可以理解为地面的“高度”。例如你的模型脚底在y0那么Distance设为0如果地面在y-1则设为-1。让物体投射阴影选中需要产生阴影的模型节点在其MeshRenderer组件中将ShadowCastingMode设置为ON。调整光源方向Planar Shadow的投影方向完全取决于你的主光源通常是DirectionalLight的方向。旋转光源阴影的方向和长短会随之变化。3.2 常见问题与解决方案问题1阴影位置不对飘在空中或沉入地底。原因Distance值设置错误或者Normal方向不垂直于你的实际地面。解决确保你的实际地面模型所在的平面与Normal定义的法线平面是同一个。最实用的调试方法创建一个简单的Plane平面网格将其摆放在你期望的阴影接收位置。然后调整Distance直到阴影刚好落在这个Plane上。调试完成后可以隐藏或删除这个Plane。问题2阴影颜色太死板边缘生硬。原因Planar Shadow天生就是硬阴影。优化调整ShadowColor不要用纯黑色(#000000)。尝试使用带透明度的深灰色或深蓝色例如rgba(0, 0, 0, 0.5)。降低不透明度可以让阴影看起来更柔和、更自然能更好地融入场景。结合环境光遮蔽在无法使用软阴影的情况下通过烘焙或SSAO屏幕空间环境光遮蔽来补充接触阴影的细节可以极大改善画面立体感分散对硬阴影边缘的注意力。问题3角色跳跃时阴影会变形或拉伸。原因这是Planar Shadow的原理性缺陷。当物体远离投影平面时根据透视投影原理其“压扁”后的影子会变大。这在物理上是不准确的点光源下才会这样但对于平行光我们期望阴影大小不变。缓解方案对于平行光引擎内部通常使用正交投影来避免这个问题。但如果你使用的是聚光灯等点光源模拟Planar Shadow这种变形是不可避免的。在这种情况下可能需要考虑切换到Shadow Map或者接受这种风格化的效果。踩坑记录我曾在一个横版游戏中使用Planar Shadow地面有细微的波浪起伏。结果发现阴影在某些波谷处会消失。原因就是Normal定义的是一个无限大的完美平面而我的地面模型有起伏当物体低于这个“数学平面”时投影计算就出错了。最终方案是微调Distance确保整个游戏过程中角色都不会低于这个理论平面。4. Shadow Map 高级配置与性能优化实战选择Shadow Map意味着你选择了效果与性能的平衡艺术。下面我们深入每个参数。4.1 核心参数拆解与调优ShadowMapSize质量与性能的阀门这个参数决定了深度贴图的分辨率如1024x1024、2048x2048。这是影响阴影清晰度和性能的最大因素。设置建议1024适用于移动端或阴影距离较近、对清晰度要求不高的场景。2048PC或主机项目的常用选择能在中等距离提供较好的阴影质量。4096用于需要极高阴影质量的静态场景或影视级渲染动态场景慎用性能消耗巨大。优化技巧采用级联阴影贴图的思路虽然Cocos Creator原生不支持CSM但可手动模拟对于大型开放世界可以只对相机近处的物体使用高分辨率ShadowMap而对于远处使用一个覆盖范围大但分辨率低的ShadowMap。这需要你根据相机位置动态调整光源的orthoSize和ShadowMapSize。Pcf柔化阴影边缘的利器PCF通过多次采样来模糊阴影边缘消除锯齿。选项HARD、FILTER_X5、FILTER_X9、FILTER_X25分别代表采样次数。选择策略HARD无过滤性能最好锯齿最明显。适合风格化或远景阴影。FILTER_X5平衡之选能在可接受的开销下提供明显的边缘改善。FILTER_X9/X25效果越来越柔和但采样次数呈平方增长对性能影响显著。通常用于PC端的高品质表现。注意PCF改善的是阴影边缘的锯齿而不是阴影本身的分辨率不足。如果ShadowMapSize太低阴影内部都会模糊成一片这时提高PCF等级反而会让情况更糟。Bias与NormalBias解决阴影瑕疵的黄金搭档这是Shadow Map调试中最关键、最繁琐的一环。Bias深度偏移主要用于解决阴影悬浮问题。增加Bias值会让深度比较更“宽松”使阴影更倾向于被判定为照亮从而让阴影看起来更贴近接收面。但值太大会导致“阴影分离”即阴影根部消失物体看起来浮空。NormalBias法线偏移主要用于解决自阴影漏光问题。它不是在深度上做偏移而是在生成Shadow Map时沿着顶点法线方向将顶点位置“挤开”一点从而在弯曲表面产生更准确的深度信息。调整这个值可以有效消除模型表面那些闪烁的、不该有的阴影斑点。调试流程先将Bias设为0.005NormalBias设为0观察是否有悬浮。如果悬浮缓慢增加Bias每次0.001直到阴影贴合。开启SelfShadow观察模型弯曲处如球体、圆柱是否有闪烁的漏光。如果有缓慢增加NormalBias从0.01开始直到漏光消失。注意过大的NormalBias会导致阴影轮廓收缩。AutoAdapt懒人必备但非万能勾选后引擎会自动根据场景中需要投射阴影的物体的包围盒计算阴影相机的Near、Far和orthoSize。优点省心特别适合相机视角和场景内容动态变化的游戏。缺点可能不够精确。自动计算的范围可能比实际需要的大导致Shadow Map的有效分辨率被浪费因为贴图大小固定覆盖范围越大每个像素对应的世界空间就越大精度越低。建议对于固定场景或镜头关闭AutoAdapt手动调节Near、Far和orthoSize。原则是用尽可能小的范围包裹住所有需要显示阴影的区域。这能最大化利用Shadow Map的纹理精度获得更清晰的阴影。4.2 性能优化组合拳分层管理阴影投射者不是所有物体都需要投射阴影。比如远处的小石子、飘落的树叶。为MeshRenderer的ShadowCastingMode设置OFF可以显著减少生成Shadow Map时的绘制调用。分层管理阴影接收者同样不是所有物体都需要接收阴影。比如天空盒、远山背景。关闭这些物体MeshRenderer上的ReceiveShadow属性。善用灯光裁剪对于SpotLight聚光灯这类有范围的光源其阴影自然只需要在光照范围内生成。确保灯光的Range和SpotAngle设置合理不要过大。静态阴影烘焙对于完全不会移动的物体如建筑、地形和静态光源考虑使用光照贴图来烘焙阴影。这可以将阴影信息“烤”进纹理运行时零开销。Cocos Creator的全局光照系统支持此功能。对于动态物体再叠加使用低精度的动态Shadow Map这是一种非常高效的混合方案。分辨率动态调整在保证视觉可接受的前提下为不同性能档位的设备配置不同的ShadowMapSize和Pcf等级。可以在游戏启动时进行设备检测并动态设置。5. 混合使用与进阶技巧在实际项目中非此即彼的选择很少更多时候需要混合与变通。5.1 Planar Shadow 模拟软阴影技巧虽然Planar Shadow本身是硬阴影但我们可以通过一点“黑科技”来模拟软阴影效果复制一份相同的阴影投射模型。为副本使用一个不同的、Distance值稍大一点的阴影平面比如抬高0.01单位。将这个副本阴影的颜色ShadowColor设置为更浅的透明度。将两个阴影叠加在一起就会形成一个中心深、边缘浅的简单渐变阴影视觉上比单层硬阴影柔和很多。当然这会增加一倍的绘制开销需权衡使用。5.2 多光源阴影的管理Cocos Creator的MaxReceived属性默认为4意味着一个物体最多可以同时接收4个光源的阴影。当场景中有多个动态光源如多个聚光灯时必须注意每个产生阴影的光源都会生成自己的Shadow Map数量翻倍性能压力巨大。合理安排确保同时影响同一区域的光源数量不超过MaxReceived否则会出现阴影显示错误。对于次要的、补充性的光源可以考虑关闭其阴影功能或者使用更廉价的方案如仅用Planar Shadow或甚至不用阴影。5.3 自定义Shader与阴影如果你使用了自定义的Shader需要确保它支持阴影。通常这意味着你的Shader需要包含必要的阴影计算宏如CC_RECEIVE_SHADOWS和正确处理阴影坐标。否则模型可能无法接收或投射阴影。最稳妥的方式是基于Cocos Creator的内置Shader如builtin-standard.effect进行修改保留其阴影相关的Pass和代码块。阴影系统的选择和调优是3D游戏开发中平衡艺术与技术的一个缩影。没有一劳永逸的银弹参数最好的参数永远是针对你特定场景、特定目标平台调试出来的。我的习惯是在项目早期就确立视觉标准和技术选型为Shadow Map预留充足的性能预算和调试时间。多尝试多对比记住那些关键的参数Size Bias PCF对视觉和性能的影响曲线你就能逐渐培养出对阴影的“手感”让它为你的游戏世界增添光彩而非带来烦恼。