【Unity3D】运动模糊特效

news/2024/11/17 3:24:13/

1 运动模糊原理

        开启混合(Blend)后,通过 Alpha 通道控制当前屏幕纹理与历史屏幕纹理进行混合,当有物体运动时,就会将当前位置的物体影像与历史位置的物体影像进行混合,从而实现运动模糊效果,即模糊拖尾效果。主要代码如下:

Pass {Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert_img // 使用内置的vert_img顶点着色器#pragma fragment fragRGB // _BlurAmount只参与混合, 不影响alpha值fixed4 fragRGB (v2f_img i) : SV_Target { // v2f_img为内置结构图, 里面只包含pos和uvreturn 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和uvreturn fixed4(tex2D(_MainTex, i.uv).rgb, _BlurAmount);}half4 fragA (v2f_img i) : SV_Target { // v2f_img为内置结构图, 里面只包含pos和uvreturn tex2D(_MainTex, i.uv);}ENDCGZTest Always Cull Off ZWrite OffPass {Blend SrcAlpha OneMinusSrcAlphaColorMask 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 ZeroColorMask 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,运动模糊特效如下:


http://www.ppmy.cn/news/209202.html

相关文章

【软件测试】软件测试总结笔记(1)

软件测试理论总结 1.Introduction1.1 What is Software Bug1.2 Tester的职责和目标其他概念软件测试的分类 2.软件开发生命周期Software Development ProcessSoftware Development Lifecycle ModelsTDD - Test-Driven Development测试驱动开发(一种敏捷开发&#x…

nginx中location和rewrite

常用的Nginx 正则表达式 ^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置 * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” :匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll…

[MAUI程序设计] 用Handler实现自定义跨平台控件

文章目录 Handler与Xamarin.Forms实现的区别为什么要用Handler代替Renderer解耦生命周期管理更细粒度的控制 用Effect来实现呢?自定义手势监听控件在各平台上实现TouchRecognizeriOS中的实现Android中的实现Windows中的实现 创建控件使用控件最终效果项目地址 今天来…

拼接图像亮度均匀调整_浅析液晶拼接屏为什么适合应用于安防显示

随着信息化技术的不断发展,可视化信息技术被广泛的应用于各类监控场所(交通指挥中心、货运码头、车站、展览馆)等。而液晶拼接大屏幕显示系统因其独特的优势被广泛的应用于安防监控场所。 液晶拼接屏的独特优势可归为以下几类: 第一、液晶拼接屏显示效果…

液晶拼接大屏的日常维护与保养

第一:避免强烈撞击 因为液晶拼接屏中含有很多精密玻璃元件和电气元件,所以液晶拼接屏的屏幕非常的娇贵,抗撞击的能力也比较差。一旦受到强烈撞击就会导致液晶拼接屏屏幕以及其它相关部件损坏。另外,不要对液晶拼接屏屏幕表面施加…

html5video拼接屏一部分黑屏,拼接屏常见问题与解决方法

拼接屏常见问题与解决方法 阅读【3057次】 日期【2018-06-11】 一般拼接屏在使用过程中常见的问题有:不工作,点不亮屏;串口不受控;有干扰;颜色不良;信号显示不满屏;不对接。这些现象大部分为操作使用不当或准备不完善所致,现就其常见原因分析如下: 一、串口不受控(可控…

液晶拼接屏安装模式

监控市场对屏的面积需求大部分项目选择3x3/3x4拼接电视墙以上的结构!液晶拼接监控室解决方案能实时、真实地反映被监控对象,其主要特点是能够融合多个高清摄像头、视频监控系统、报警系统、达到快速的安全防范监控。液晶产品亮度高、色彩艳丽,多重数字矩阵拼接,可任…

液晶拼接处理器_大屏幕显示系统设备中矩阵与液晶拼接屏的连接方法

随着液晶拼接大屏幕显示系统设备的应用越来越广阔,很多人似乎对矩阵与液晶拼接屏的连接方法还是一知半解,下面耐诺科技为您详细的介绍一下矩阵与液晶拼接屏的连接方法 3*3 1. 周边设备:一套完整的液晶拼接大屏幕显示系统还需要有各类线材、每一种线材的数量都与拼接屏的数量…