Unity Shader 中 ShadowCaster的作用和疑问

1. ShadowCaster(核心 ------ 让物体能投影)

  • LightMode = ShadowCaster:URP 渲染 Shadow Map 时会调用此 Pass
  • ColorMask 0:不输出颜色,只写深度
  • 顶点关键步骤:
    • TransformObjectToWorld / TransformObjectToWorldNormal 拿到世界空间位置和法线
    • 通过 ApplyShadowBias(positionWS, normalWS, lightDirWS) 做法线偏移和深度偏移,消除自阴影 acne
    • TransformWorldToHClip 投影到光源裁剪空间
    • 最后钳制 positionCS.zUNITY_NEAR_CLIP_VALUE,防止偏移后越过近裁剪面
  • 依据 keyword _CASTING_PUNCTUAL_LIGHT_SHADOW 区分方向光 / 聚光灯(用 _LightDirection)和点光源(用 _LightPosition 做方向计算)
  • _LightDirection / _LightPosition 这两个全局变量由 URP 的 ShadowCasterPass C# 代码每帧设置

2. DepthOnly(配套 ------ 写深度图)

  • LightMode = DepthOnly:URP 在生成 _CameraDepthTexture 时使用
  • 只写深度,ColorMask 0
  • 后处理(SSAO、景深、雾效、软粒子等)需要深度图时才会生效,没有它也不影响基本投影

现在的渲染行为

功能 是否支持
接收主光源阴影(原 ASE 效果)
投影到地面/其它物体 ✓(新增)
点光源/聚光灯阴影投射 ✓(通过 _CASTING_PUNCTUAL_LIGHT_SHADOW
参与 _CameraDepthTexture ✓(新增)
参与 _CameraNormalsTexture(SSAO 用) ✗(若后续需要可加 DepthNormals Pass)

如果还需要 DepthNormalsOnly(SSAO 的 Depth Normal 模式会用到),告诉我再补上。

DepthOnly 这个pass做什么用的

DepthOnly Pass 是做什么的

一句话概括

DepthOnly Pass 的作用是:当 URP 需要单独生成一张"全场景深度图"(_CameraDepthTexture)时,用它把这个物体的深度写进去,而不输出任何颜色。

它不是用来"投影"的

很多人会把它和 ShadowCaster 搞混,区别如下:

Pass 谁在调用 写入目标 用途
ShadowCaster URP 的 MainLightShadowCasterPass / AdditionalLightsShadowCasterPass 光源视角的 Shadow Map 投影 ------ 让别的物体能"看到"此物体投下的阴影
DepthOnly URP 的 DepthOnlyPass / DepthPrepass 摄像机视角的 _CameraDepthTexture 深度图 ------ 给后处理、特效采样深度用

两个 Pass 视角不同、目标 RT 也不同。

什么时候会被调用

URP 只在满足以下任一条件时才会跑 DepthOnly

  1. Universal Renderer 里勾选了 "Depth Texture"(或某个后处理/Feature 需要它)
  2. 场景中有脚本 / Shader 访问 _CameraDepthTexture
  3. 开启了依赖深度图的特性,常见的有:
    • SSAO(Screen 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 的关系

还有一个兄弟 Pass:

  • DepthOnlyLightMode = DepthOnly):只写深度
  • DepthNormalsLightMode = DepthNormalsOnly):同时写深度 + 世界空间法线,SSAO 的 "Depth Normals" 模式会用它

URP 会根据 Renderer 设置二选一调用,所以严谨做法是两个都提供。

相关推荐
avi911142 分钟前
Unity商业插件之(三) Editor扩展,二次开发
unity·单例·editor扩展·editor开发
winlife_2 小时前
让 AI 自动跑 PlayMode 回归测试:从 BUG 注入到自动判 FAIL 的完整闭环
人工智能·unity·bug·ai编程·mcp·回归测试·游戏测试
WarPigs18 小时前
游戏签到系统
unity
小拉达不是臭老鼠21 小时前
Unity中的UI系统之UGUI
学习·ui·unity
万兴丶21 小时前
Coplay适用于 Unity 的“Al 代理”使用指南
unity·游戏引擎·ai编程
魔士于安1 天前
Unity材质球大合集
unity·游戏引擎·材质
mxwin1 天前
Unity Shader 冰面 Shader 制作原理与流程
unity·游戏引擎·shader
玖玥拾1 天前
Cocos学习笔记:关卡系统、音频管理与物理控制
游戏引擎·cocos2d
小拉达不是臭老鼠1 天前
Unity中的UI系统之UGUI_登陆面板实现
ui·unity
郝学胜-神的一滴1 天前
[简化版 GAMES 101] 计算机图形学 11:频域·卷积·抗锯齿
c++·unity·图形渲染·opengl·three·unreal