首页 > 其他分享 >【Unity3D】运动模糊特效

【Unity3D】运动模糊特效

时间:2023-08-11 21:11:52浏览次数:47  
标签:Unity3D vert img 特效 模糊 纹理 屏幕 historyTexture

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,无运动模糊特效,如下:

img

2)运动模糊效果

​ 将 blurAmount 设置为 0.9,运动模糊特效如下:

img

​ 声明:本文转自【Unity3D】运动模糊特效

标签:Unity3D,vert,img,特效,模糊,纹理,屏幕,historyTexture
From: https://www.cnblogs.com/zhyan8/p/17615600.html

相关文章

  • NUKE14 mac版电影后期特效合成软件功能强大、速度快
    NUKE14是一款电影后期特效合成软件,功能强大、速度快,拥有非常专业的后期效果。NUKE14Mac版是一款功能强大的电影后期特效合成软件,提供多种强大的电影后期处理效果,包括电影、动画、漫画、建筑等。可以将多个独立的视频文件合并成一个文件;或者将单个文件组合到一起;或者把两个或......
  • 【Unity3D】高斯模糊特效
    1高斯模糊原理​边缘检测特效中使用了卷积运算进行了边缘检测,本文实现的高斯模糊特效同样使用了卷积运算,关于卷积核和卷积运算的概念,读者可以参考边缘检测特效。​本文完整资源见→Unity3D高斯模糊特效。​我们将用于模糊处理的卷积核称为模糊算子,它一般满足以下......
  • 【Unity3D】边缘检测特效
    1边缘检测原理​边缘检测的原理是:检测每个像素周围的像素亮度差,如果亮度差异较大,就将该像素识别为边缘,并进行边缘着色。​本文完整资源见→Unity3D边缘检测特效。​使用过卷积神经网络(CNN)的人,一定知道卷积运算,笔者之前有写过相关文章(使用CNN实现MNIST数据集分类、......
  • 五百个炫酷文字特效——预设的使用
    需要安装Birdge新建一个文件动画-浏览预设进入到text就是本文特效特别多的动画想使用的话,直接拖动就好了就能做出这样的效果了调一下颜色可以出现这种高端的效果了这里面的效果很多,可以多试一试输出到渲染序列或Me也可以导入到PR里面......
  • 【Unity3D】广告牌特效
    1前言​广告牌特效是指:空间中的一个2D对象始终(或尽可能)面向相机,使得用户能够尽可能看清楚该2D物体。广告牌特效一共有以下3种:正视广告牌:广告牌始终以正视图姿态面向相机,即广告牌的x、y、z轴正方向始终指向相机的x、y、z轴正方向;血条广告牌:游戏中的血条效果广告......
  • 【Unity3D】调整屏幕亮度、饱和度、对比度
    1屏幕后处理流程​调整屏幕亮度、饱和度、对比度,需要使用到屏幕后处理技术。因此,本文将先介绍屏幕后处理流程,再介绍调整屏幕亮度、饱和度、对比度的实现。​本文完整资源见→Unity3D调整屏幕亮度、饱和度、对比度。​屏幕后处理即:渲染完所有对象后,得到一张屏幕图......
  • 输入框 input的 支持 clearable 清空 select 下拉列表框的 支持 clearable 清空 fil
    开发的前端 中select 下拉列表框 必须支持1、模糊查询2、清空按钮......
  • 模糊综合评价
    pdf:模糊综合评价.pdf别人的:https://zhuanlan.zhihu.com/p/160846498方法流程确定为评价类题目,并且评价指标无法明确划出界限确定因素集(可能使用多级,或者主成分分析法)确定因素集权重,可以使用层次分析or熵权法确定评语集(是否有感情色彩)确定因素集中每个因素的隶属函数F......
  • 论文解读:《基于深度多核学习的用于识别 DNA n4 -甲基胞嘧啶位点的高阶模糊推理系统》
    Title:Adeepmultiplekernellearning-basedhigher-orderfuzzyinferencesystemforidentifyingDNAN4-methylcytosinesites期刊:InformationSciences中科院分区:一区(计算机科学技术)影像因子:8.1↓0.133文章链接:https://doi.org/10.1016/j.ins.2023.01.149Websever:Github:......
  • 高效控制轨道——折叠栅格化特效开
    第一个是折叠按钮我们在发现层太多了,我们不想看到他我们把需要的层先锁定起来,然后选中没用的层然后点上面的总控开关要注意,这里的层没有消失,只是让我们折叠起来了当我们把导入的东西放大后,会出现像素点但是我们选中栅格化后就变得清晰,也就是第二个按钮后面的哪个就......