Unity Shader unity文档学习笔记(十七):径向模糊 实现类似冲锋时的速度感
实现思路:离中心点越远的像素 模糊效果越明显 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文档学习笔记(十七):径向模糊 实现类似冲锋时的速度感相关推荐
- 【ember zigbee】序章:协议栈相关文档学习笔记
原文地址:https://blog.csdn.net/tainjau/article/details/90648114 文章目录 写在前面 一.材料出处 二.文档解析 2.1.EZSP Protoco ...
- python定义函数的组成部分有_Python文档学习笔记(4)--定义函数
定义函数 关键字 def 引入函数的定义.其后必须跟有函数名和以括号标明的形式参数列表.组成函数体的语句从下一行开始,且必须缩进. 执行 一个函数会引入一个用于函数的局部变量的新符号表. 因此,在函数 ...
- IAM 策略文档学习笔记
策略文档 IAM 许可策略 附加到确定角色可执行哪些任务的角色.将许可限定为仅角色需要进行的操作,以及仅为进行这些操作角色需要的资源.您可以使用 AWS 管理的或客户创建的 IAM 许可策略 操作:您 ...
- w3schools文档学习笔记 - XML
http://www.w3school.com.cn/xml/xml_syntax.asp 在 XML 中,省略关闭标签是非法的.所有元素都必须有关闭标签 声明不属于XML本身的组成部分.它不是 XM ...
- Vue3 文档学习笔记
vue3学习笔记 setup() 生命周期的与vue2的不同点在:beforeCreated.created都在setup()里进行默认调用,其他的都要写在setup()里面,算做compositio ...
- Unity Shader unity文档学习笔记(十一):战争迷雾核心算法
核心算法 非常简单 主要就是把一个点的世界坐标转换到贴图的UV坐标 给整个场景一个大的plane 加上写的shader 摄像机位置调成plane的正上方 Shader "Unlit/FogR ...
- Django1.10文档学习笔记二
创建应用 1 创建project Django-admin startproject mysite 自动创建目录结构: mysite/ #项目容器 Manage.py #命令行工具 mys ...
- Unity功能—— 在VS中快速访问Unity API对应文档
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能-- 在VS中快速访问Unity API对应文档 文章目录 Unity功能-- ...
- 《Unity Shader入门精要》笔记:初级篇(2)
本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载. 本篇博客会补充一些扩展内容(例如其他博客链接). 本篇博客还会提供一些边读边做的效果截图.文章内所有数学 ...
最新文章
- 同一Linux下起两台Mysql Server
- MyBatis基础入门《九》ResultMap自动匹配
- 谈谈IT界8大恐怖预言!
- 主板和cpu搭配表_GTX1650显卡搭配知识:GTX1650配什么CPU和主板及多大电源?
- deepin系统中.txt文件图标显示内容问题_深度系统Deepin 20最新正式版发布:从DDE到应用全面升级-Deepin 20,深度系统 ——快科技(驱动之家旗下媒体)-...
- C++中的值初始化和默认初始化
- 袁亚湘:愿为数学做更多
- SQL分页查询的介绍以及好处~~
- 【运动女神】99年、健身达人、北方女孩、直爽善谈、乐天派、旅行爱好者
- activiti学习
- Asp.net报错汇总:回发或回调参数无效
- MOS管自举电容工作原理电路设计及其分析
- BD电影搜索-自定义过滤器
- iOS Technical Support For All-AFastRecord
- 实现防火墙的主要技术
- Java的wait()、notify()学习三部曲之一:JVM源码分析
- vue2里面的Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location
- 【存储器了解 RAM flash和eeprom存储器的区别和作用】
- gta5 oracle文件,gta5 oracle | 手游网游页游攻略大全
- MATLAB | 一个贼简单的粒子圣诞树