技术标签: Unity3D 运动模糊 # Shader Motion Blur 模糊拖尾
开启混合(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运动模糊特效。
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 通道的值。
1)原图效果
将 blurAmount 设置为 0,无运动模糊特效,如下:
2)运动模糊效果
将 blurAmount 设置为 0.9,运动模糊特效如下:
文章浏览阅读1.4k次,点赞36次,收藏36次。SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其核心思想就是解耦。模块之间基于接口编程,模块之间不对实现类进行硬编码,当代码里涉及具体的实现类,就违反了可拔插的原则,为了实现在模块装配的时候能不在程序里动态指明,就需要spi了。这里我们要跟API区分开来,简单介绍一下API。_java autoservice
文章浏览阅读5.8k次,点赞9次,收藏19次。安装好git包后,但在vsc中却提示:" 未找到 Git。请安装 Git,或在 "git.path" 设置中配置"的解决处理办法._git path
文章浏览阅读9.3k次,点赞11次,收藏90次。在 VMware 虚拟机 linux 环境下安装 Docker,超详细流程_vmware安装docker
文章浏览阅读2.8k次。我在学生时代,几乎所有的笔记本都是横线本,也是这两年先后发现了不同的笔记方式。上次去图书馆发现了《聪明人用方格笔记本》,顺手带回家放置了很久,终于决定不能再拖下去了,昨天用1个半小时看完了。很多人在学生阶段、工作阶段,都少不了记笔记的经历,那么你有没有想过,记笔记的目的是什么呢?笔记的生命线是“再现性”,这是记笔记的最终目的。 --by《聪明人用方格笔记本》做笔记的过程也是信息整理的过程,我们做笔..._5mm小格子怎么用
文章浏览阅读5.7k次,点赞6次,收藏28次。C语言之字符的拼接_用vc6.0进行字符串的拼接代码
文章浏览阅读4.5k次,点赞2次,收藏8次。1、明确核心业务主流程首次接入数据埋点,建议选择与产品核心业务最关联的业务流程进行分析例如:电商类APP的“购买流程”、“售后流程”金融类APP的“投资流程”、“新用户活动流程”咨询类APP的“文章阅读”、“分享&回流”2、确定用户执行主流程时各个关键行为点例如电商APP“购买流程”可分解如下几个关键行为点搜索商品查看商品详情选择收货人创建订单支付订单_软件埋点 如何报价
文章浏览阅读1.2k次,点赞26次,收藏12次。在Matlab中调用Python需要先设置Python的路径(pyenv在Matlab中调用Python的函数有两种方式,一种是使用py函数,一种是使用函数;在Matlab中调用Python的CoolProp接口,需要导入CoolProp模块,然后调用函数即可。可以写一个Matlab函数,来调用PropsSI函数。使用函数;在Matlab中调用Python的CoolProp接口,需要导入CoolProp模块,然后调用函数即可。可以写一个Matlab函数,来调用PropsSI函数。_matlab中使用coolprop
文章浏览阅读1k次,点赞2次,收藏3次。数据湖加速器(Data Lake Accelerator Goose FileSystem,GooseFS),是由腾讯云推出的高可靠、高可用、弹性的数据湖加速服务。依靠对象存储(Cloud Object Storage,COS)作为数据湖存储底座的成本优势,为数据湖生态中的计算应用提供统一的数据湖入口,加速海量数据分析、机器学习、人工智能等业务访问存储的性能;采用了分布式集群架构,具备弹性、高可靠、高可用等特性,为上层计算应用提供统一的命名空间和访问协议,方便用户在不同的存储系统管理和流转数据。_goosefs
文章浏览阅读2.3k次,点赞17次,收藏22次。今天介绍给大家介绍语音合成相关的技术,希望对大家能有所帮助!语音合成简单来说就是把文字信息转换为标准语音的过程,最终可以输出对应的音频文件。可以实现让机器像人类一样可以实时的说话。涉及的领域有声学、语言学、数字信号处理、计算机管理等方面的知识。主要包括:获取输入的文本→语言处理→韵律处理→声学处理→输出音频文件。其中语音识别主要是语言处理、韵律处理、声学处理_语音合成需要什么知识和技能
文章浏览阅读464次。sklearn.mixture.BayesianGaussianMixturesklearn.mixture.GaussianMixturefrom sklearn.mixture import GaussianMixturefrom sklearn.mixture import BayesianGaussianMixturefrom sklearn.datasets.samples_generator import make_blobsX, y = make_blobs(n_sam_bayesiangaussianmixture
文章浏览阅读4.2k次。由于种种原因,很多人选择了测试这个职业,在职场和测试领域当中几经风雨,有的人顺时应势走出了一片天地,有的人选择离开从事其他职业……笔者作为一个在测试行业略有想法的测试人员,对测试人员的职业规划和职业发展做一些总结和大致方向的展望,以此希望对刚选择测试职业的人,对那些在测试职业发展过程中看不清自己方向,比较迷茫的人,给出一些参考,可以让大家借鉴。大家的想法和心得体会彼此印证,从而在后续的生活和工作中,找到自己的发展方向和目标,并去坚持的走下去。本文分两个阶段描述测试人员的职业规划和职业发展,第_测试工程师规划
文章浏览阅读227次。微内核(microkernel)相关from :http://www.yandong.org/archives/191介绍WIKI上的解释是:在计算机科学中,微内核是一个近乎最小的软件集合,但具有能够提供实现操作系统所需的机制。Incomputer science, amicrokernelis the near-minimum amount of software that can pr..._linux micro kernel