热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Unity3dShader】运动模糊

摄影常用的一招就是延时摄影,以使运动的物体产生运动模糊。摄影技巧为:1,三角架固定相机;2,调长曝光时间&#

摄影常用的一招就是延时摄影,以使运动的物体产生运动模糊。

摄影技巧为:1,三角架固定相机;2,调长曝光时间;3,对象有运动物体和静止物体参照

用了延时摄影,照片会产生艺术感,见下图(2015年1月 拍摄于上海陆家嘴)

 

游戏方面可喜的是Unity3d也可以实现类似效果,先看效果图

第一张为无运动模糊

第二张为有运动模糊:主体人物清晰,场景运动

第三张为第二张gif中的一帧

第四张为有运动模糊:摄像机不动,人物动的效果(凌波微步)

原理:

累积缓冲区:允许在渲染到颜色缓冲区之后,不是把结果显示到窗口上,而是把内容复制到累积缓冲区,这样就可以把颜色缓冲区与累积缓冲区中的内容反复进行混合,可以用来进行模糊处理和抗锯齿。

我们代码的实现是利用了一块累积缓存来混合多张连续的图像。我们不断的不当前图像叠加到之前渲染好的图像中。

 

shader代码

Shader "mgo/motion_blur"
{Properties{_MainTex("Texture", 2D) &#61; "white" {}_BlurSize("_BlurSize", range(0.001, 0.999)) &#61; 0.9}SubShader{Tags{ "RenderType" &#61; "Opaque" }ZTest Offcull OffZWrite OffBlend SrcAlpha OneMinusSrcAlphaPass{Name "Main"CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata {float4 vertex:POSITION;float2 uv:TEXCOORD0;};struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD0;};uniform sampler2D _MainTex;uniform half _BlurSize;v2f vert(appdata v){v2f o;o.pos &#61; UnityObjectToClipPos(v.vertex);o.uv &#61; v.uv;return o;}fixed4 frag(v2f i) : SV_Target{fixed4 color &#61; tex2D(_MainTex,i.uv);//降低中心人物的运动模糊startfloat r &#61; sqrt(pow(i.uv.x-0.5,2) &#43; pow(i.uv.y-0.6,2));float a &#61; _BlurSize * pow((1 - r &#43; 0.01), 5);if (a <1 - _BlurSize){a &#61; 1 - _BlurSize;}color.a &#61; a;//降低中心人物的运动模糊end//color.a &#61; 1 - _BlurSize;return color;}ENDCG}}
}

 c#代码

using UnityEngine;namespace GameBase.Effect
{public class MotionBlurEffect : ImageEffectBase{[SerializeField][Range(0.001f, 0.999f)]private float _blurSize &#61; 0.9f;private void OnEnable(){material.SetFloat("_BlurSize", _blurSize);}protected override void OnDisable(){base.OnDisable();RenderTexture.ReleaseTemporary(_accumulationRT);_accumulationRT &#61; null;}private RenderTexture _accumulationRT;void OnRenderImage(RenderTexture source, RenderTexture destination){if(_accumulationRT &#61;&#61; null || _accumulationRT.width !&#61; source.width || _accumulationRT.height !&#61; source.height){if(_accumulationRT !&#61; null)RenderTexture.ReleaseTemporary(_accumulationRT);_accumulationRT &#61; RenderTexture.GetTemporary(source.width, source.height, 0, source.format);_accumulationRT.hideFlags &#61; HideFlags.HideAndDontSave;Graphics.Blit(source, _accumulationRT);}_accumulationRT.MarkRestoreExpected();//性能开销很大&#xff0c;看下官方文档Graphics.Blit(source, _accumulationRT, material);Graphics.Blit(_accumulationRT, destination);}}
}

 


推荐阅读
  • Go语言实现Redis客户端与服务器的交互机制深入解析
    在前文对Godis v1.0版本的基础功能进行了详细介绍后,本文将重点探讨如何实现客户端与服务器之间的交互机制。通过具体代码实现,使客户端与服务器能够顺利通信,赋予项目实际运行的能力。本文将详细解析Go语言在实现这一过程中的关键技术和实现细节,帮助读者深入了解Redis客户端与服务器的交互原理。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 在运行时动态获取Entity Framework中的ObjectSet可以通过反射机制实现。这种方法允许开发者在应用程序运行期间根据需要加载不同的实体集合,从而提高代码的灵活性和可扩展性。通过使用`DbContext`类的`Set`方法,结合类型信息,可以轻松地实现这一目标。此外,还可以利用`Type`对象和泛型方法来进一步增强动态性,确保在处理多种实体类型时更加高效和安全。 ... [详细]
  • 本文探讨了如何在 Google Sheets 中通过自定义函数实现 AJAX 调用。具体介绍了编写脚本的方法,以便在电子表格中发起 AJAX 请求,从而实现数据的动态获取与更新。这种方法不仅简化了数据处理流程,还提高了工作效率。 ... [详细]
  • 利用C#技术实现Word文档的动态生成与编辑
    本文通过一个简单的示例,介绍了如何使用C#语言实现Word文档的动态生成与编辑功能。文章详细阐述了在项目中引用Word动态库的方法,并通过具体代码示例展示了如何创建和操作Word表格。此内容旨在为初学者提供参考和学习资料,欢迎读者提出宝贵意见和建议。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 在Unity中进行3D建模的全面指南,详细介绍了市场上三种主要的3D建模工具:Blender 3D、Maya和3ds Max。每种工具的特点、优势及其在Unity开发中的应用将被深入探讨,帮助开发者选择最适合自己的建模软件。 ... [详细]
  • 本文将详细介绍在Android应用中添加自定义返回按钮的方法,帮助开发者更好地理解和实现这一功能。通过具体的代码示例和步骤说明,本文旨在为初学者提供清晰的指导,确保他们在开发过程中能够顺利集成返回按钮,提升用户体验。 ... [详细]
  • 本文介绍了如何通过掌握 IScroll 技巧来实现流畅的上拉加载和下拉刷新功能。首先,需要按正确的顺序引入相关文件:1. Zepto;2. iScroll.js;3. scroll-probe.js。此外,还提供了完整的代码示例,可在 GitHub 仓库中查看。通过这些步骤,开发者可以轻松实现高效、流畅的滚动效果,提升用户体验。 ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • MySQL性能优化与调参指南【数据库管理】
    本文详细探讨了MySQL数据库的性能优化与参数调整技巧,旨在帮助数据库管理员和开发人员提升系统的运行效率。内容涵盖索引优化、查询优化、配置参数调整等方面,结合实际案例进行深入分析,提供实用的操作建议。此外,还介绍了常见的性能监控工具和方法,助力读者全面掌握MySQL性能优化的核心技能。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
author-avatar
世卍界创意驿站肀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有