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或自定义SmoothnessMetallicpass)
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 共有)
- 只能反射屏幕上可见的内容 --- 镜头外的物体不会出现
- 屏幕边缘容易断/弹 --- 靠 Vignette 和 Temporal 缓解
- 被遮挡的背面反射不准 --- 可选 backface 追踪,代价很高
- 性能:全屏 ray march,移动端通常要降分辨率(Downsample)、减 Sample Count,或用 Dark Reflections 风格模式
6. 在你们项目里怎么快速对照
在 Unity 里可以这样查:
- Project Settings → Graphics → URP Asset → Renderer
看是否有 Shiny SSRR Renderer Feature - 场景里找 Global Volume
看是否有 Shiny Screen Space Raytraced Reflections override - 若是 Forward:看需要反光的物体上有没有
Reflections组件 - 插件目录一般在
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 窗口里的根目录路径发我即可。