Unity Shader 中 ShadowCaster的作用和疑问
1.ShadowCaster核心 —— 让物体能投影LightMode ShadowCasterURP 渲染 Shadow Map 时会调用此 PassColorMask 0不输出颜色只写深度顶点关键步骤TransformObjectToWorld/TransformObjectToWorldNormal拿到世界空间位置和法线通过ApplyShadowBias(positionWS, normalWS, lightDirWS)做法线偏移和深度偏移消除自阴影 acneTransformWorldToHClip投影到光源裁剪空间最后钳制positionCS.z到UNITY_NEAR_CLIP_VALUE防止偏移后越过近裁剪面依据 keyword_CASTING_PUNCTUAL_LIGHT_SHADOW区分方向光 / 聚光灯用_LightDirection和点光源用_LightPosition做方向计算_LightDirection/_LightPosition这两个全局变量由 URP 的ShadowCasterPassC# 代码每帧设置2.DepthOnly配套 —— 写深度图LightMode DepthOnlyURP 在生成_CameraDepthTexture时使用只写深度ColorMask 0后处理SSAO、景深、雾效、软粒子等需要深度图时才会生效没有它也不影响基本投影现在的渲染行为功能是否支持接收主光源阴影原 ASE 效果✓投影到地面/其它物体✓新增点光源/聚光灯阴影投射✓通过_CASTING_PUNCTUAL_LIGHT_SHADOW参与_CameraDepthTexture✓新增参与_CameraNormalsTextureSSAO 用✗若后续需要可加 DepthNormals Pass如果还需要DepthNormalsOnlySSAO 的 Depth Normal 模式会用到告诉我再补上。DepthOnly 这个pass做什么用的DepthOnlyPass 是做什么的一句话概括DepthOnlyPass 的作用是当 URP 需要单独生成一张全场景深度图_CameraDepthTexture时用它把这个物体的深度写进去而不输出任何颜色。它不是用来投影的很多人会把它和ShadowCaster搞混区别如下Pass谁在调用写入目标用途ShadowCasterURP 的MainLightShadowCasterPass/AdditionalLightsShadowCasterPass光源视角的 Shadow Map投影 —— 让别的物体能看到此物体投下的阴影DepthOnlyURP 的DepthOnlyPass/DepthPrepass摄像机视角的_CameraDepthTexture深度图 —— 给后处理、特效采样深度用两个 Pass 视角不同、目标 RT 也不同。什么时候会被调用URP 只在满足以下任一条件时才会跑DepthOnlyUniversal Renderer 里勾选了 Depth Texture或某个后处理/Feature 需要它场景中有脚本 / Shader 访问_CameraDepthTexture开启了依赖深度图的特性常见的有SSAOScreen Space Ambient Occlusion后处理中的景深Depth of Field软粒子Soft Particles体积雾 / 高度雾屏幕空间反射 / 折射、水面、某些后处理描边部分自定义 Shader而且 URP 会自动选择使用 Depth Prepass提前跑一遍DepthOnly还是 从 GBuffer / Opaque 拷贝策略由 Renderer 设置决定。如果没有DepthOnly会怎样不影响你物体自身的渲染 —— Forward Pass 照常输出颜色不影响它投射阴影 —— 那是ShadowCaster的事但是当 URP 走 Depth Prepass 模式时没有DepthOnly的物体会在_CameraDepthTexture里缺失后果SSAO 不作用在它身上、后处理景深对它失效、软粒子穿模、体积雾里它没遮挡……和DepthNormals的关系还有一个兄弟 PassDepthOnlyLightMode DepthOnly只写深度DepthNormalsLightMode DepthNormalsOnly同时写深度 世界空间法线SSAO 的 Depth Normals 模式会用它URP 会根据 Renderer 设置二选一调用所以严谨做法是两个都提供。