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

相关推荐
叶帆1 天前
【YFIOs】用C#开发硬件之设备上云
开发语言·unity·c#
久数君1 天前
AI三维建模工具“造形家”:地理场景三维化的高效解决方案
unity·glb·ai算法·ai三维建模工具·地图框选·造形家·城市建筑模型
会思考的猴子1 天前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai3152475432 天前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
心前阳光2 天前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光2 天前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯2 天前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
龙智DevSecOps解决方案2 天前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
葛兰岱尔2 天前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity
鼎艺创新科技2 天前
三维电子沙盘中OSGB倾斜摄影数据的加载与渲染
游戏引擎·cocos2d