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 小时前
基于MVVM框架的XUUI 扩展的UI管理系统教程
unity·mvvm·ui框架·xuui·ui管理器
丁小未18 小时前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
丁小未19 小时前
基于MVVM框架的XUUI MoreComplex案例
unity·c#
EQ-雪梨蛋花汤19 小时前
【Unity笔记】VR 一体机画面锯齿、模型边缘闪烁、接缝抖动排查:MSAA、Mipmap、Render Scale、Z-Fighting 全流程记录
笔记·unity·vr
松树戈1 天前
【Godot4精进之路】03~Godot编辑器常用界面介绍
编辑器·游戏引擎·godot
YigAin1 天前
Unity Spine 资源出现白边的解决办法
unity·游戏引擎·spine
郝学胜-神的一滴2 天前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
_helen_5202 天前
unreal engine 虚拟现实 + airsim
游戏引擎·vr·虚幻
真鬼1234 天前
【Unity WebGL】内嵌网页与双向通信
unity·游戏引擎·webgl
zyh______4 天前
C#语法糖(按照实用性排序)
unity·c#