Unity Shader Shiny SSRR

Shiny SSRR(Kronnect 的 Screen Space Raytraced Reflections)是一套实时屏幕空间反射方案:不依赖 Reflection Probe 烘焙,也不做镜面相机,而是在当前帧的 Depth / Color 等缓冲里做光线步进(ray marching),把「屏幕上已经画出来的内容」当作反射源。

你们项目是 URP,下面按 URP 流程说明(Built-in 类似,只是挂在 Camera 上而不是 Renderer Feature)。

整体架构

场景配置每帧输入Shiny 核心URP Renderer Feature: Shiny SSRRVolume: Shiny SSRR OverrideReflections 组件 - Forward 可选Depth BufferNormalsSmoothness / MetallicScene Color屏幕空间 Ray MarchBinary Search 精修Temporal Filter 时域滤波合成反射到最终画面


1. 插件在 URP 里怎么挂

组件作用

Shiny SSRR Renderer Feature

插入 URP 渲染管线,在指定 Render Pass Event(默认不透明+透明之后)执行 SSR

Volume Override

全局/局部调节强度、射线长度、采样数、Fresnel、模糊等

Reflections 脚本

Forward 模式必需:标记哪些物体参与反射,并把材质的 smoothness/metallic 传给 GPU

ShinyTransparentSupport

透明物体(水、玻璃)需要额外深度/法线时挂在物体上

Deferred 模式下勾选 Renderer Feature 的 Use Deferred,可从 G-Buffer 自动读法线、光滑度,所有不透明表面都能反射,一般不用逐个挂 Reflections

Forward 模式没有 G-Buffer,必须给需要反射的物体加 Reflections,否则插件不知道哪些像素该算反射、表面有多光滑。


2. 核心算法(每帧在 GPU 上做什么)

对每个可能产生反射的像素(由 smoothness 阈值等决定):

Step A — 重建表面信息

  • 从 Depth 反推该像素的世界/视空间位置
  • 读取 Normal(Deferred 来自 G-Buffer;Forward 来自 DepthNormals 或材质 bump)
  • 读取 Smoothness / Metallic(Deferred 来自 G-Buffer;Forward 来自 Reflections 或自定义 SmoothnessMetallic pass)

Step B — 计算反射方向

  • 用视线方向 + 法线得到反射向量
  • 按 Fresnel 决定反射强度(掠射角弱、正对强)
  • Smoothness 低 → 反射更糊或跳过;Smoothness 高 → 强反射

Step C — 屏幕空间 Ray Marching

这是 SSR 的本质:

反射点 ──→ 沿反射方向一步步前进 ──→ 每步投影到屏幕 UV

比较「射线深度」和 Depth Buffer

射线深度 > 场景深度 → 可能相交,继续/二分

找到交点 → 在该 UV 采样 Scene Color

可调参数大致对应:

  • Sample Count / Step Size:步数与步长(越大越远、越贵)
  • Max Ray Length:最大追踪距离
  • Binary Search:粗找交点后再二分,提高边缘精度(contact hardening 的基础)

Step D — 后处理与合成

  • Contact Hardening:近处反射更 sharp,远处更模糊
  • Distance Decay / Fuzziness:随距离衰减
  • Temporal Filter:与上一帧混合,减少闪烁
  • Vignette:屏幕边缘减弱反射,减轻物体刚进入画面时的「弹出感」
  • 射线未命中时:可回退到 Skybox / Cubemap

最后把反射色按强度、Fresnel、能量守恒等规则混合进原场景颜色。


3. Forward vs Deferred 的数据来源差异

模式法线 / 光滑度来源谁参与反射

Deferred

G-Buffer 逐像素

所有不透明物体自动

Forward

DepthNormals + Reflections 脚本

仅挂了 Reflections 的物体(可按 Layer/名称/子网格筛选)

Forward 还可开 Custom Smoothness/Metallic Pass:在 shader 里加名为 "SmoothnessMetallic" 的 pass(R=smoothness, G=metallic),实现「只有湿地/积水区域才反射」这类按 mask 控制。


4. 透明物体(水、玻璃、水坑)

透明物默认可能不进 Depth / DepthNormals,SSR 射线「看不见」它们。需要:

  • Renderer Feature 开 Depth Prepass,Layer Mask 包含透明层
  • 需要更好法线时开 Screen Space Normals
  • 或在物体上加 ShinyTransparentSupport

5. 本质限制(所有 SSR 共有)

  1. 只能反射屏幕上可见的内容 — 镜头外的物体不会出现
  2. 屏幕边缘容易断/弹 — 靠 Vignette 和 Temporal 缓解
  3. 被遮挡的背面反射不准 — 可选 backface 追踪,代价很高
  4. 性能:全屏 ray march,移动端通常要降分辨率(Downsample)、减 Sample Count,或用 Dark Reflections 风格模式

6. 在你们项目里怎么快速对照

在 Unity 里可以这样查:

  1. Project Settings → Graphics → URP Asset → Renderer
    看是否有 Shiny SSRR Renderer Feature
  2. 场景里找 Global Volume
    看是否有 Shiny Screen Space Raytraced Reflections override
  3. 若是 Forward:看需要反光的物体上有没有 Reflections 组件
  4. 插件目录一般在 Assets 下 Kronnect 相关文件夹,内含 Demo Scene、Runtime、Shaders

一句话总结

Shiny SSRR = URP 渲染特征 + Volume 参数 驱动的全屏后处理:对每个光滑像素沿反射方向在 Depth Buffer 里逐步追踪,命中处采样 Scene Color 作为反射,再经 Fresnel、模糊、时域滤波合成回画面;Deferred 自动读 G-Buffer,Forward 需 Reflections 脚本指定参与物体。

如果你愿意,我可以根据你项目里 ShinySSRR 的实际路径,把 Renderer Feature 插入点、具体 shader pass 名称、C# 入口类 逐文件对照讲一遍。把插件在 Project 窗口里的根目录路径发我即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值