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 窗口里的根目录路径发我即可。

相关推荐
警醒与鞭策33 分钟前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
xcLeigh2 小时前
Unity基础:Destroy与DestroyImmediate——正确销毁游戏物体的方式
游戏·unity·游戏引擎·教程
lllhhh_远方7 小时前
unity中URP场景阴影锯齿严重解决方案
unity·游戏引擎
淡海水10 小时前
07-06-源码-.NET Core GC的极致优化技术
unity·架构·c#·.netcore·gc·1024程序员节
野区捕龙为宠11 小时前
Unity 中使用 UnityWebRequest 加载 StreamingAssets 文件夹中的图片
unity·游戏引擎
北里闻箫12 小时前
推荐一款游戏引擎,一剑十八年引擎(YiJian18-Engine) - 跨平台2D/3D ECS 游戏引擎
3d·游戏引擎
淡海水1 天前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
FFFFujige1 天前
【Unity】基于Dots + Luban的Buff模块
unity·游戏引擎
紫龙大侠1 天前
Unity许可证文件(激活成功后)默认保存位置
unity
Msir_Modern1 天前
Noita 元胞沙盒笔记
算法·unity·c#·游戏引擎·元胞自动机