实现思路:离中心点越远的像素 模糊效果越明显 UV偏移的量越大
shader

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "3D/ScreenEdgeBlur" {
//------------------------------------【属性值】------------------------------------Properties{_MainTex("主纹理 (RGB)", 2D) = "white" {}_IterationNumber("迭代次数", Int)=16 }//------------------------------------【唯一的子着色器】------------------------------------SubShader{ //--------------------------------唯一的通道-------------------------------Pass{//设置深度测试模式:渲染所有像素.等同于关闭透明度测试(AlphaTest Off)ZTest Always//===========开启CG着色器语言编写模块===========CGPROGRAM//编译指令: 指定着色器编译目标为Shader Model 3.0#pragma target 3.0//编译指令:告知编译器顶点和片段着色函数的名称//vert_img是在UnityCG.cginc中定义好的,当后处理vert阶段计算常规,可以直接使用自带的vert_img#pragma vertex vert_img#pragma fragment frag_blur//包含辅助CG头文件#include "UnityCG.cginc"//外部变量的声明uniform sampler2D _MainTex;uniform float2 _center;uniform int _IterationNumber;float4 frag_blur(v2f_img  i) : SV_TARGET{//【2】获取纹理坐标的x,y坐标值float2 uv = i.uv;//【3】纹理坐标按照中心位置进行一个偏移uv -= _center;//【4】初始化一个颜色值float4 color = float4(0.0, 0.0, 0.0, 0.0);//【6】设置坐标缩放比例的值float scale = 1;//【7】进行纹理颜色的迭代for (int j = 1; j < _IterationNumber; ++j){//将主纹理在不同坐标采样下的颜色值进行迭代累加color += tex2D(_MainTex, uv * scale + _center);//坐标缩放比例依据循环参数的改变而变化scale = 1 + (float(j * 0.02));}//【8】将最终的颜色值除以迭代次数,取平均值color /= (float)_IterationNumber;return color;}//===========结束CG着色器语言编写模块===========ENDCG}}}

C#

using UnityEngine;
using System.Collections;
using XLua;
namespace bgdust
{[ExecuteInEditMode]public class ScreenBlurEffect : MonoBehaviour{//-------------------变量声明部分-------------------#region Variablespublic Shader CurShader;//着色器实例private Material CurMaterial;//当前的材质[Range(2, 50)]public float IterationNumber = 15;public Vector2 center = new Vector2(0.5f, 0.5f);public static Vector2 ChangeValue;public static float ChangeValue2;#endregion//-------------------------材质的get&set----------------------------#region MaterialGetAndSetMaterial material{get{if (CurMaterial == null){CurMaterial = new Material(CurShader);CurMaterial.hideFlags = HideFlags.HideAndDontSave;}return CurMaterial;}}#endregion//-----------------------------------------【Start()函数】---------------------------------------------  // 说明:此函数仅在Update函数第一次被调用前被调用//--------------------------------------------------------------------------------------------------------void Start(){//依此赋值ChangeValue = center;ChangeValue2 = IterationNumber;//找到当前的Shader文件CurShader = Shader.Find("3D/ScreenEdgeBlur1");//判断是否支持屏幕特效if (!SystemInfo.supportsImageEffects){enabled = false;return;}}//-------------------------------------【OnRenderImage()函数】------------------------------------  // 说明:此函数在当完成所有渲染图片后被调用,用来渲染图片后期效果//--------------------------------------------------------------------------------------------------------void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture){if (CurShader != null){//申请两块降低分辨率的RT 优化像素的采样次数//RenderTexture rt1 = RenderTexture.GetTemporary(sourceTexture.width / (int)IterationNumber, sourceTexture.height / (int)IterationNumber, 0, sourceTexture.format);RenderTexture rt1 = RenderTexture.GetTemporary(sourceTexture.width, sourceTexture.height, 0, sourceTexture.format);Graphics.Blit(sourceTexture, rt1);//设置Shader中的外部变量material.SetFloat("_IterationNumber", IterationNumber);material.SetVector("_center", center);//将进行过模糊操作的RT输出出来用rt2存起来Graphics.Blit(rt1, destTexture, material, 0);RenderTexture.ReleaseTemporary(rt1);}//着色器实例为空,直接拷贝屏幕上的效果。此情况下是没有实现屏幕特效的else{//直接拷贝源纹理到目标渲染纹理Graphics.Blit(sourceTexture, destTexture);}}//-----------------------------------------【OnValidate()函数】--------------------------------------  // 说明:此函数在编辑器中该脚本的某个值发生了改变后被调用//--------------------------------------------------------------------------------------------------------void OnValidate(){//将编辑器中的值赋值回来,确保在编辑器中值的改变立刻让结果生效ChangeValue2 = IterationNumber;ChangeValue = center;}//-----------------------------------------【OnDisable()函数】---------------------------------------  // 说明:当对象变为不可用或非激活状态时此函数便被调用  //--------------------------------------------------------------------------------------------------------void OnDisable(){if (CurMaterial){DestroyImmediate(CurMaterial);}}}}

原图

正常效果

降低分辨率后的效果

Unity Shader unity文档学习笔记(十七):径向模糊 实现类似冲锋时的速度感相关推荐

  1. 【ember zigbee】序章:协议栈相关文档学习笔记

    原文地址:https://blog.csdn.net/tainjau/article/details/90648114 文章目录 写在前面 一.材料出处 二.文档解析 2.1.EZSP Protoco ...

  2. python定义函数的组成部分有_Python文档学习笔记(4)--定义函数

    定义函数 关键字 def 引入函数的定义.其后必须跟有函数名和以括号标明的形式参数列表.组成函数体的语句从下一行开始,且必须缩进. 执行 一个函数会引入一个用于函数的局部变量的新符号表. 因此,在函数 ...

  3. IAM 策略文档学习笔记

    策略文档 IAM 许可策略 附加到确定角色可执行哪些任务的角色.将许可限定为仅角色需要进行的操作,以及仅为进行这些操作角色需要的资源.您可以使用 AWS 管理的或客户创建的 IAM 许可策略 操作:您 ...

  4. w3schools文档学习笔记 - XML

    http://www.w3school.com.cn/xml/xml_syntax.asp 在 XML 中,省略关闭标签是非法的.所有元素都必须有关闭标签 声明不属于XML本身的组成部分.它不是 XM ...

  5. Vue3 文档学习笔记

    vue3学习笔记 setup() 生命周期的与vue2的不同点在:beforeCreated.created都在setup()里进行默认调用,其他的都要写在setup()里面,算做compositio ...

  6. Unity Shader unity文档学习笔记(十一):战争迷雾核心算法

    核心算法 非常简单 主要就是把一个点的世界坐标转换到贴图的UV坐标 给整个场景一个大的plane 加上写的shader 摄像机位置调成plane的正上方 Shader "Unlit/FogR ...

  7. Django1.10文档学习笔记二

    创建应用 1 创建project Django-admin startproject mysite 自动创建目录结构: mysite/    #项目容器 Manage.py    #命令行工具 mys ...

  8. Unity功能—— 在VS中快速访问Unity API对应文档

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能-- 在VS中快速访问Unity API对应文档 文章目录 Unity功能-- ...

  9. 《Unity Shader入门精要》笔记:初级篇(2)

    本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载. 本篇博客会补充一些扩展内容(例如其他博客链接). 本篇博客还会提供一些边读边做的效果截图.文章内所有数学 ...

最新文章

  1. 同一Linux下起两台Mysql Server
  2. MyBatis基础入门《九》ResultMap自动匹配
  3. 谈谈IT界8大恐怖预言!
  4. 主板和cpu搭配表_GTX1650显卡搭配知识:GTX1650配什么CPU和主板及多大电源?
  5. deepin系统中.txt文件图标显示内容问题_深度系统Deepin 20最新正式版发布:从DDE到应用全面升级-Deepin 20,深度系统 ——快科技(驱动之家旗下媒体)-...
  6. C++中的值初始化和默认初始化
  7. 袁亚湘:愿为数学做更多
  8. SQL分页查询的介绍以及好处~~
  9. 【运动女神】99年、健身达人、北方女孩、直爽善谈、乐天派、旅行爱好者
  10. activiti学习
  11. Asp.net报错汇总:回发或回调参数无效
  12. MOS管自举电容工作原理电路设计及其分析
  13. BD电影搜索-自定义过滤器
  14. iOS Technical Support For All-AFastRecord
  15. 实现防火墙的主要技术
  16. Java的wait()、notify()学习三部曲之一:JVM源码分析
  17. vue2里面的Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location
  18. 【存储器了解 RAM flash和eeprom存储器的区别和作用】
  19. gta5 oracle文件,gta5 oracle | 手游网游页游攻略大全
  20. MATLAB | 一个贼简单的粒子圣诞树

热门文章

  1. 系统集成项目管理工程师知识点总结
  2. pid_t pid = fork()
  3. 苏宁易购开放平台_大增56.83%!苏宁开放平台表现优越,助推业绩实现高增长
  4. python 爬取_Python爬取电影天堂
  5. html使用正则验证
  6. iOS LeetCode ☞ 找到字符串中所有字母异位词
  7. MATLAB通过句柄调用函数
  8. 自定义拍照时 拍照界面_满地金黄!正是拍照打卡时
  9. 玩游戏也能赚钱?还有这种操作?
  10. Keepass用插件实现运维便捷