【URP】Unity[后处理]运动模糊MotionBlur
【从UnityURP开始探索游戏渲染】专栏-直达
Motion Blur 概念与作用
Motion Blur(运动模糊)是一种模拟真实相机在拍摄快速移动物体或自身移动时产生的模糊效果的后处理技术。它通过模糊图像中运动物体的轨迹,增强动态场景的真实感和速度感。
在游戏开发中,Motion Blur 主要有以下用途:
- 增强速度感和动态效果,特别是在赛车、动作类游戏中
- 弥补低帧率带来的不流畅感,使30帧画面看起来更平滑
- 增加电影感和沉浸式体验
- 模拟真实相机的物理特性,提高场景真实度
发展历史
Motion Blur 技术的发展经历了几个阶段:
- 帧模糊Frame Blur:早期最简单的实现方式,通过混合当前帧与前一帧图像来模拟模糊效果。这种方法简单但不够真实,无法对不同物体应用不同程度的模糊。
- 位置重建Position Reconstruction:通过深度缓冲区重建屏幕空间位置,结合前一帧的变换矩阵计算像素位移。这种方法适合静态场景的相机运动模糊。
- 速度缓冲Velocity Buffer:现代主流方法,为每个像素存储运动矢量信息,根据速度方向进行模糊处理。URP和HDRP都采用这种实现方式。
- 优化算法:如UE4采用的velocity flatten和tile gather/scatter技术,通过分块处理提高性能。
URP 中的实现原理
URP 中的 Motion Blur 实现基于速度缓冲技术,核心流程如下:
- 记录前一帧的观察矩阵和投影矩阵
- 计算当前帧与前一帧相同位置的位置差,得到速度方向
- 沿着速度方向进行多次采样,混合结果产生模糊效果
- 通过质量参数控制采样次数,平衡性能与效果
URP 的实现相比传统方法更加轻量,主要针对相机运动模糊进行了优化。
Unity URP中的MotionBlur(运动模糊)效果通过模拟真实相机在曝光时间内物体快速移动或相机自身运动导致的图像模糊现象实现。其核心原理基于速度缓冲区和历史帧混合技术
物理原理基础
运动模糊源于现实相机曝光期间物体位置变化导致的像素累积效应。当快门开启时,快速移动的物体会在传感器上留下连续轨迹,表现为模糊效果。在URP中,这一过程通过计算物体或相机在相邻帧间的运动矢量(Velocity Buffer)来模拟。
技术实现流程
速度缓冲区生成
URP通过渲染物体的运动矢量到缓冲区,记录每个像素在屏幕空间中的位移。这需要启用"Motion Vectors"选项,并依赖深度纹理重建世界坐标。例如,Shader中会使用当前帧与上一帧的视图-投影逆矩阵(
_InverseVPMatrix和_PreInverseVPMatrix)计算像素位置变化。模糊计算
采用多采样点混合策略:根据速度矢量方向,对当前像素及其邻近像素进行加权平均。采样数(Sample Count)和质量预设(Quality)直接影响模糊平滑度和性能消耗。示例公式如下:
S(t)=(1−α)⋅x(t)+α⋅S(t−1)
其中α控制历史帧权重,较低值(如0.1)会产生更长拖尾效果。
性能优化
- 钳制参数Clamp:限制相机旋转产生的最大速度值(默认0.05,屏幕比例),避免极端位移导致性能下降。
- 强度控制Intensity:0-1范围调节模糊程度,实际通过缩放速度矢量长度实现。
示例配置步骤
在URP中启用运动模糊需通过Volume系统:
创建Volume对象并添加
Motion Blur覆盖。关键参数设置示例:这会产生强烈但受控的模糊效果,适合高速运动场景。
Quality: High
Intensity: 0.8
Clamp: 0.1
与HDRP实现差异
URP仅支持相机运动模糊,而HDRP还支持物体独立运动模糊,并能分离处理旋转/平移分量(通过Camera Clamp Mode)。两者均依赖体积系统,但HDRP提供更细粒度的速度阈值控制(Minimum/Maximum Velocity)。
完整实现可参考GitHub上的URP运动模糊Shader工程,其中包含世界坐标重建和线性深度处理等关键技术点
完整 URP 实现示例
URP Motion Blur 设置步骤
项目准备
- 确保项目使用URP管线
- 创建URP Asset(如果尚未创建)
- 在Edit > Project Settings > Graphics中分配URP Asset
启用后处理
- 在URP Asset的Renderer列表中找到使用的Renderer
- 勾选"Post-processing"选项
相机设置
- 选择主相机
- 在Inspector中勾选"Post Processing"
添加Volume
- 在场景中创建空GameObject
- 添加Volume组件
- 点击"New"创建Profile
- 在Profile中添加Motion Blur效果
调整参数
- 根据需要调整Quality、Intensity和Clamp参数
- 测试不同场景下的效果表现
参数详解与实际用例
URP Motion Blur 的主要参数及其应用场景
Quality(质量)
- 含义:控制效果的质量级别,影响采样次数和精度
- 取值范围:低/中/高/自定义
- 用例:移动平台建议使用"低"或"中",PC平台可使用"高"
Intensity(强度)
- 含义:控制模糊效果的强度
- 取值范围:0(无模糊)到1(最大模糊)
- 用例:赛车游戏高速移动时可设为0.8-1.0,一般场景0.3-0.5
Clamp(钳制)
- 含义:限制相机旋转产生的最大速度长度
- 取值范围:0-0.2(屏幕比例)
- 用例:防止快速旋转相机时产生过度模糊,默认0.05适合大多数情况
Sample Count(采样数)
- 含义:计算模糊时的采样点数(仅在自定义质量时可用)
- 取值范围:通常4-32
- 用例:高质量效果需要更多采样,但性能消耗更大
实际应用建议
性能优化:
- 在移动设备上,使用较低的质量预设和强度值
艺术控制:
- 通过调整参数创造不同的视觉效果,如:
- 轻微模糊(强度0.2-0.3)增强电影感
- 强烈模糊(强度0.8-1.0)表现极速运动
场景适配:
- 根据场景运动幅度调整参数,静态场景可完全禁用
组合效果:
- 与其他后处理效果如Bloom、Chromatic Aberration组合使用,增强整体视觉冲击
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【URP】Unity[后处理]运动模糊MotionBlur的更多相关文章
- Unity shader学习之屏幕后期处理效果之运动模糊
运动模糊,代码如下: using UnityEngine; public class MotionBlurRenderer : PostEffectRenderer { [Range(0.1f, 0. ...
- OpenCV3入门(十三)图像运动模糊
1.原理 运动模糊产生: 由于相机传感器或物体相对运动, 按快门瞬间造成图像产生运动模糊. 在用摄像机获取景物图像时,如果在相机曝光期间景物和摄像机之间存在相对运动,例如用照相机拍摄快速运动的物体,或 ...
- 从单幅图像高质量去除运动模糊——读JiaYaJia同名英文论文总结
原始论文在这里 http://www.cse.cuhk.edu.hk/leojia/projects/motion_deblurring/ 一.概述 论文根据以下的基本模糊图像模型建立 其中I是我们观 ...
- Java 运动模糊
Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...
- 维纳滤波和编码曝光PSF去除运动模糊【matlab】
编码曝光知识 - ostartech - 博客园 https://www.cnblogs.com/wxl845235800/p/8276362.html %%%%%%%%%%%%%%%%%%%%%%% ...
- Win8 Metro(C#)数字图像处理--2.50图像运动模糊
原文:Win8 Metro(C#)数字图像处理--2.50图像运动模糊 [函数名称] 图像运动模糊算法 MotionblurProcess(WriteableBitmap src,int ...
- Unity Shader 屏幕后效果——摄像机运动模糊(速度映射图实现)
速度映射图主要是为了得到每个像素相对于前一帧的运动矢量,其中一种方法是使用摄像机的深度纹理来推导. 推导过程如下: 先由深度纹理逆推出NDC(归一化的设备坐标)下的顶点坐标,利用VP矩阵(视角*投影矩 ...
- Unity全屏模糊
先上效果,左边模糊 其实用的是Unity Stard Effect里的资源,一个脚本一个shader //脚本代码 using UnityEngine; using System.Collection ...
- Unity 后处理堆
Unity安装后处理的过程:windows---PacageManager---Post Processing Post Processing后处理堆需要知道要修改那个相机渲染的内容,先定位到相机,再 ...
- Unity VideoPlayer视频模糊
如果视频出现模糊或者尺寸不对只需要修改Texture的Size就可以 注意一点 Size的值要跟视频尺寸一直
随机推荐
- 无源互调分析仪PIM Analyzer原理及应用
一 .无源互调原理概述 1.无源互调的定义 无源互调(Passive Intermodulation)是指两个或更多不同频率的信号混合输入到无源器件中,在其它频率产生幅度不同的杂散信号. 如果互调信号 ...
- 站在巨人的肩膀上:gRPC通过HTTP/2构建云原生时代的通信标准
gRPC:云原生时代的通信标准 gRPC将HTTP/2作为其传输层,并在此基础上定义了自身的通信语义.gRPC支持四种服务方法类型,它们都映射到HTTP/2的流模型上. 1)Unary RPC: 客户 ...
- msys2 mingw64 ffmpeg 搭建最新ffmpeg编译环境 可用 ffmpeg 4.1 及更新版本
介绍 最近需要编译Windows版本ffmpeg,各种折腾,最后从一个大神那找到了方案, 非常感谢 liaofeifly 这位大神. 不多说直接来说明怎么搭环境: 1. 下载msys2 https:/ ...
- Physics-Augmented Learning: A New Paradigm Beyond Physics-Informed Learning.
https://arxiv.org/abs/2109.13901 摘要 在本文中,作者希望将物理信息学习(physics-informed learning, PIL)进一步推广,从而提出了一个新的模 ...
- 从复刻到超越,抖音同款RTC撑起线上泛娱乐
「不同时代的人有不同的娱乐方式.」 载歌载舞可以说是人类最古老.最原始的休闲方式之一.商周之际,歌舞的形式更为多样化.南北朝到隋唐,歌舞活动成为当时人们闲暇聚会.休闲娱乐的主要形式.时代在推进,人们娱 ...
- dockerfile1
dockerfile介绍 dockerfile是用来构建docker镜像的文件!命令参数脚本! 构建步骤: 编写一个dokerfile文件 docker build 构建一个镜像 docker run ...
- FMC子卡设计原理图:FMC228-四路1.2Gsps 16bit DA FMC子卡
FMC228-四路1.2Gsps 16bit DA FMC子卡 一.板卡概述 FMC228 板卡可实现宽波段.四通道.16位.1.2Gsps(600Msps直接射频综合)DAC功能,时钟可采用内部时钟 ...
- java——双列集合
java--双列集合 双列集合一次需要存一对数据,分别为键和值 键不能重复 键和值是一一对应的,每一个键只能找到自己对应的值 键+值这个整体我们称之为"键值对"或"键值对 ...
- 小区物业管理系统+SpringBoot + Vue (前后端分离)
大家好,今天给大家带来一个超级简单的 小区物业管理系统.大家可用学习下系统的设计和源码风格. 视频演示 https://githubs.xyz/show/2d0e7e08-fc27-4bad-9456 ...
- QDialog::show
何志丹 无论是setModel true,还是false. show都是马上返回, show后面的代码执行完之前,本对话框和其他对话框都是无法操作的.