Unity Shader 中 ShadowCaster的作用和疑问

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

  • LightMode = ShadowCaster:URP 渲染 Shadow Map 时会调用此 Pass
  • ColorMask 0:不输出颜色,只写深度
  • 顶点关键步骤:
    • TransformObjectToWorld / TransformObjectToWorldNormal 拿到世界空间位置和法线
    • 通过 ApplyShadowBias(positionWS, normalWS, lightDirWS) 做法线偏移和深度偏移,消除自阴影 acne
    • TransformWorldToHClip 投影到光源裁剪空间
    • 最后钳制 positionCS.z 到 UNITY_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 设置二选一调用,所以严谨做法是两个都提供。

内容概要:本文详细记录了对一个Android ARM64静态ELF文件中字符串加密机制的逆向分析过程。该ELF文件的所有字符串均被加密,无法通过常规strings命令或IDA直接识别。作者通过分析发现,加密字符串存储在.rodata段,其解密所需信息(包括密文地址、长度16位密钥)保存在.data.rel.ro段的40字节描述符中。核心解密函数sub_10F408采用自反的双pass流密码算法,结合固定密钥KEY_TERM(由.data段24字节数据计算得出),实现字节级非线性、位置与长度相关的加密。文章还复现了完整的Python解密脚本,并揭示了该保护机制的本质为代码混淆而非强加密,最终成功批量解密全部956条字符串,暴露程序真实行为,如shell命令模板、设备标识篡改、网络重置等操作。此外,文中还提及未启用的自定义壳框架及其反dump设计。; 适合人群:具备逆向工程基础的安全研究人员、二进制分析人员及对ELF保护技术感兴趣的开发者。; 使用场景及目标:①学习ELF二进制中字符串加密的典型实现方式与逆向突破口;②掌握从结构识别、函数追踪到算法还原的完整逆向流程;③理解“绑定二进制”的完整性校验设计及其局限性;④实践编写IDAPython脚本自动化提取与解密敏感数据。; 阅读建议:此资源以实战案例驱动,不仅展示技术细节,更强调逆向思维与验证方法,建议读者结合IDA调试环境,逐步跟随文中步骤进行动态分析与算法验证,深入理解每一步的推理依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值