【Unity3D】运动模糊特效
1 运动模糊原理
开启混合(Blend)后,通过 Alpha 通道控制当前屏幕纹理与历史屏幕纹理进行混合,当有物体运动时,就会将当前位置的物体影像与历史位置的物体影像进行混合,从而实现运动模糊效果,即模糊拖尾效果。主要代码如下:
Pass {
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert_img // 使用内置的vert_img顶点着色器
#pragma fragment fragRGB // _BlurAmount只参与混合, 不影响alpha值
fixed4 fragRGB (v2f_img i) : SV_Target { // v2f_img为内置结构体, 里面只包含pos和uv
return fixed4(tex2D(_MainTex, i.uv).rgb, _BlurAmount); // 模糊值, 通过alpha通道控制当前屏幕纹理与历史屏幕纹理进行混合
}
ENDCG
}
本文完整资源 见→Unity3D运动模糊特效。
2 代码实现
MotionBlur.cs
using UnityEngine;
[RequireComponent(typeof(Camera))] // 需要相机组件
public class MotionBlur : MonoBehaviour {
[Range(0.0f, 0.9f)]
public float blurAmount = 0.5f; // 模糊值, 值越大拖尾效果越明显
private RenderTexture historyTexture; // 历史屏幕纹理
private Material material = null; // 材质
private void Start() {
material = new Material(Shader.Find("MyShader/MotionBlur"));
material.hideFlags = HideFlags.DontSave;
}
void OnDisable() { // 脚本不运行时立即销毁, 下次开始应用运动模糊时, 重新混合图像
DestroyImmediate(historyTexture);
}
void OnRenderImage(RenderTexture src, RenderTexture dest) {
if (material != null) {
// 初始化时或窗口尺寸变化时, 创建叠加纹理
if (historyTexture == null || historyTexture.width != src.width || historyTexture.height != src.height) {
DestroyImmediate(historyTexture);
historyTexture = new RenderTexture(src.width, src.height, 0);
historyTexture.hideFlags = HideFlags.HideAndDontSave;
Graphics.Blit(src, historyTexture);
}
material.SetFloat("_BlurAmount", 1.0f - blurAmount); // 设置模糊值, 通过alpha通道控制当前屏幕纹理与历史屏幕纹理进行混合
Graphics.Blit(src, historyTexture, material);
Graphics.Blit(historyTexture, dest);
} else {
Graphics.Blit(src, dest);
}
}
}
MotionBlur.shader
Shader "MyShader/MotionBlur" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {} // 主纹理
_BlurAmount ("Blur Amount", Float) = 1.0 // 模糊值, 通过alpha通道控制当前屏幕纹理与历史屏幕纹理进行混合
}
SubShader {
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex; // 主纹理
fixed _BlurAmount; // 模糊值, 通过alpha通道控制当前屏幕纹理与历史屏幕纹理进行混合
fixed4 fragRGB (v2f_img i) : SV_Target { // v2f_img为内置结构体, 里面只包含pos和uv
return fixed4(tex2D(_MainTex, i.uv).rgb, _BlurAmount);
}
half4 fragA (v2f_img i) : SV_Target { // v2f_img为内置结构体, 里面只包含pos和uv
return tex2D(_MainTex, i.uv);
}
ENDCG
ZTest Always Cull Off ZWrite Off
Pass {
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB // 允许通过的颜色通道, 取值有: 0、R、G、B、A、RGBA的组合(RG、RGB等)
CGPROGRAM
#pragma vertex vert_img // 使用内置的vert_img顶点着色器
#pragma fragment fragRGB // _BlurAmount只参与混合, 不影响alpha值
ENDCG
}
Pass {
Blend One Zero
ColorMask A // 允许通过的颜色通道, 取值有: 0、R、G、B、A、RGBA的组合(RG、RGB等)
CGPROGRAM
#pragma vertex vert_img // 使用内置的vert_img顶点着色器
#pragma fragment fragA // 使用纹理原本的alpha值
ENDCG
}
}
FallBack Off
}
说明: vert_img 是 Unity 内置的顶点着色器,v2f_img 是 Unity 内置的结构体变量,vert_img 和 v2f_img 的实现见→Shader常量、变量、结构体、函数;第一个 Pass 通过 Alpha 通道控制当前屏幕纹理与历史屏幕纹理进行混合,通过 ColorMask RGB 保证混合不影响 Alpha 通道值;第二个 Pass 对当前屏幕的 Alpha 通道进行采样,通过 ColorMask A 保证采样不影响 RGB 通道的值。
3 运行效果
1)原图效果
将 blurAmount 设置为 0,无运动模糊特效,如下:
2)运动模糊效果
将 blurAmount 设置为 0.9,运动模糊特效如下:
声明:本文转自【Unity3D】运动模糊特效。
【Unity3D】运动模糊特效的更多相关文章
- 基于HTML5 Canvas实现的图片马赛克模糊特效
效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...
- 从单幅图像高质量去除运动模糊——读JiaYaJia同名英文论文总结
原始论文在这里 http://www.cse.cuhk.edu.hk/leojia/projects/motion_deblurring/ 一.概述 论文根据以下的基本模糊图像模型建立 其中I是我们观 ...
- Java 运动模糊
Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...
- Unity shader学习之屏幕后期处理效果之运动模糊
运动模糊,代码如下: using UnityEngine; public class MotionBlurRenderer : PostEffectRenderer { [Range(0.1f, 0. ...
- 维纳滤波和编码曝光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 ...
- OpenCV3入门(十三)图像运动模糊
1.原理 运动模糊产生: 由于相机传感器或物体相对运动, 按快门瞬间造成图像产生运动模糊. 在用摄像机获取景物图像时,如果在相机曝光期间景物和摄像机之间存在相对运动,例如用照相机拍摄快速运动的物体,或 ...
- Unity3D图像后处理特效——Depth of Field 3.4
Depth of Field 3.4 is a common postprocessing effect that simulates the properties of a camera lens. ...
- Unity Shader 屏幕后效果——摄像机运动模糊(速度映射图实现)
速度映射图主要是为了得到每个像素相对于前一帧的运动矢量,其中一种方法是使用摄像机的深度纹理来推导. 推导过程如下: 先由深度纹理逆推出NDC(归一化的设备坐标)下的顶点坐标,利用VP矩阵(视角*投影矩 ...
- unity3d 摄像机抖动特效
摄像机抖动特效 在须要的地方调用CameraShake.Shake()方法就能够
随机推荐
- 2022-01-29:连接词。 给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。 连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串
2022-01-29:连接词. 给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 . 连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串 ...
- JVM 优化踩坑记
本文记录了服务 JVM 优化的过程与思路,有对 JVM GC 原理以及对问题排查方向和工具的介绍,也有走弯路和踩坑,分享出来希望对大家有所帮助. 本文概要 服务异常和排查过程 RPC 接口超时的排查方 ...
- Selenium - 基础知识介绍
Selenium - 基础知识介绍 介绍 Selenium是ThoughtWorks员工在业余时间开发并维护的开源项目,并且在ThoughtWorks的项 目中被广泛应用. 简单地说,Selenium ...
- 狂神说ngnix笔记
Nginx 一.什么是Nginx 二.Nginx的作用 三.Nginx的安装 1. Windows下安装 2.Linux下安装 3.Nginx目录结构 4.Nginx常用命令 5.Nginx配置文件结 ...
- 为什么 GPU 能够极大地提高仿真速度?
这里的提速主要是针对时域电磁算法的.因为时域算法的蛙跳推进模式仅对大量存放在固定 位置的数据进行完全相同的且是简单的操作(移位相加),这正是 GPU 这类众核 SIMD 架构所进行的运算,即 ALU ...
- 代码随想录算法训练营Day24 回溯算法| 理论基础 77. 组合
代码随想录算法训练营 回溯 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式. 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯. 回溯是递归的副 ...
- drf多方式登录接口(手机号、邮箱、验证码)登录
题目 ##### 3 多方式登录接口#### -使用auth的user表扩写 -用户名+密码 -手机号+密码 -邮箱+密码 -签发token逻辑,放在序列化类中写 方式一: serializer.py ...
- 翻车了,被读者找出 BUG
大家好呀,我是小楼. 本文是上篇文章<使用增强版 singleflight 合并事件推送,效果炸裂!>的续集,没看过前文必须要先看完才能看本文,实在不想看,拉到文章末尾,给我点个赞再退出吧 ...
- OSI七层协议剩余、socket模块、半连接池
传输层之TCP与UDP协议 TCP与UDP都是用来规定通信方式的 通信的时候可以随心所欲的聊 也可以遵循一些协议符合要求的聊 随心所欲的聊:文字 图片 视频 遵循一些协议:开头带尊称 首行空两个 只准 ...
- 实时光线追踪(3)Ray Casting
目录 硬件光追(Hardware Ray Tracing) 加速结构(Acceleration Structure,AS) AS 策略 Ray Tracing Pipeline Ray Generat ...