Shader 屏幕后期特效 Shake(震屏)&Wave(波纹)
震屏效果

Shader:
////////////////////////////////////////////
///// CameraPlay - by VETASOFT 2017 /////
//////////////////////////////////////////// Shader "CameraPlay/Shake" {
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_TimeX ("Time", Range(0.0, 1.0)) = 1.0
_ScreenResolution ("_ScreenResolution", Vector) = (.,.,.,.)
}
SubShader
{
Pass
{
ZTest Always
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#pragma target 3.0
#pragma glsl
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _TimeX;
uniform float _Value;
uniform float _Value2;
uniform float _Value3;
uniform float4 _ScreenResolution;
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float2 texcoord : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color;
return OUT;
} float nrand(float2 n)
{
return frac(sin(dot(n.xy, float2(12.9898, 78.233)))* 43758.5453);
} float4 frag (v2f i) : COLOR
{
float2 uv = i.texcoord.xy;
float t = float(int(_TimeX * _Value));
float2 suv = float2(,);
suv.x = uv.x + _Value2 * nrand(t);
suv.y = uv.y + _Value3 * nrand(t + 23.0);
suv.x -=_Value2/;
suv.y -=_Value3/;
float3 col = tex2D(_MainTex,suv).rgb;
return float4(col,1.0);
}
ENDCG
}
}
}
Controller:
////////////////////////////////////////////
///// CameraPlay - by VETASOFT 2017 /////
//////////////////////////////////////////// using UnityEngine; public class ShakeController : MonoBehaviour
{
[HideInInspector] public Shader m_shader;
private float m_time = 1.0f;
private Vector4 m_screenResolution;
private Material m_material;
[HideInInspector] public float m_value = 0.5f;
[HideInInspector] public float m_size = 1f;
[HideInInspector] public float m_duration = 1f;
[HideInInspector] private float m_timer = 1f;
[HideInInspector] public float m_speed = 15f; Material material
{
get
{
if (m_material == null)
{
m_material = new Material(m_shader);
m_material.hideFlags = HideFlags.HideAndDontSave;
}
return m_material;
}
}
void Awake()
{
m_value = ;
m_timer = ;
m_shader = Shader.Find("CameraPlay/Shake");
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
Debug.Log("手机不支持后处理...");
return;
} m_duration = 0.2f;
m_speed = ;
m_size = ;
} // Start Animation
void OnEnable()
{
m_value = ;
m_timer = ;
} void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
{
if (m_shader != null)
{
m_time += Time.deltaTime;
if (m_time > ) m_time = ;
material.SetFloat("_TimeX", m_time);
material.SetFloat("_Value", m_speed);
material.SetFloat("_Value2", m_size * 0.008f);
material.SetFloat("_Value3", m_size * 0.008f);
material.SetVector("_ScreenResolution", new Vector4(sourceTexture.width, sourceTexture.height, 0.0f, 0.0f));
Graphics.Blit(sourceTexture, destTexture, material);
}
else
{
Graphics.Blit(sourceTexture, destTexture);
}
}
void Update()
{ m_timer += Time.deltaTime * ( / m_duration);
if (m_timer > 1.1f) /*Object.Destroy(this);*/
this.enabled = false;
}
void OnDisable()
{
if (m_material)
{
DestroyImmediate(m_material);
}
}
}
使用方法:
1.Shader和Controller拖进项目。Shader还要丢到Edit - Project Settings -Graphics 的Always included Shaders 中
2.摄像机上挂载对应脚本,控制脚本的Enable属性即可
杂谈:
Shader控制震屏比animation控制更简单,而且不易出错
波纹效果

Shader:
////////////////////////////////////////////
///// CameraPlay - by VETASOFT 2017 /////
//////////////////////////////////////////// Shader "CameraPlay/ShockWave"
{
Properties
{
_MainTex("Base (RGB)", 2D) = "white" {}
_TimeX("Time", Range(0.0, 1.0)) = 1.0
_ScreenResolution("_ScreenResolution", Vector) = (.,.,.,.)
}
SubShader
{
Pass
{ ZTest Always
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//#pragma fragmentoption ARB_precision_hint_fastest
#pragma target 3.0
//#pragma glsl
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float _TimeX;
uniform float _Value;
uniform float _Value2;
uniform float _Value3;
uniform float _Value4;
uniform float4 _ScreenResolution;
uniform float2 _MainTex_TexelSize; struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float2 texcoord : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 color : COLOR;
};
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = UnityObjectToClipPos(IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color;
return OUT;
}
float4 frag(v2f i) : COLOR
{
float2 uv = i.texcoord.xy;
float2 uv2 = uv;
#if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < )
uv.y = - uv.y;
#endif
float Dist = distance(uv, float2(_Value, _Value2));
float Diff = (Dist - _Value3);
float v = (1.0 - pow(abs(Diff * 10.0), 0.8));
float vt = v * 0.02 * _Value4;
vt = saturate(vt);
uv2.x = uv2.x - vt;
uv2.y = uv2.y - vt;
float4 Color = tex2D(_MainTex, uv2);
Color.rgb += float3(vt, vt, vt); return Color;
}
ENDCG
}
}
}
Controller:
/***************************************
Editor: Tason
Version: v1.0
Last Edit Date: 2018-XX-XX
Tel: 328791554@qq.com
Function Doc: ***************************************/ using UnityEngine; public class WaveController : MonoBehaviour
{
[HideInInspector] public Shader m_shader;
private float m_time = 1.0f;
private Vector4 m_screenResolution;
private Material m_material;
[HideInInspector] public float m_posX = 0.5f;
[HideInInspector] public float m_posY = 0.5f;
[HideInInspector] public float m_value = 0.5f;
[HideInInspector] public float m_size = 1f;
[HideInInspector] public float m_duration = 1f;
[HideInInspector] private float m_timer = 1f; Material material
{
get
{
if (m_material == null)
{
m_material = new Material(m_shader);
m_material.hideFlags = HideFlags.HideAndDontSave;
}
return m_material;
}
} void Awake()
{
m_value = ;
m_timer = ;
m_shader = Shader.Find("CameraPlay/ShockWave");
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
Debug.Log("手机不支持后处理...");
return;
} m_posX = 0.5f;
m_posY = 0.5f;
m_duration = 1.5f * ;
m_size = ;
} void OnRenderImage(RenderTexture sourceTexture, RenderTexture destTexture)
{
if (m_shader != null)
{
m_time += Time.deltaTime;
if (m_time > ) m_time = ;
material.SetFloat("_TimeX", m_time);
material.SetFloat("_Value", m_posX);
material.SetFloat("_Value2", m_posY);
material.SetFloat("_Value3", m_value);
material.SetFloat("_Value4", m_size);
material.SetVector("_ScreenResolution", new Vector4(sourceTexture.width, sourceTexture.height, 0.0f, 0.0f));
Graphics.Blit(sourceTexture, destTexture, material);
}
else
{
Graphics.Blit(sourceTexture, destTexture);
}
} void OnEnable()
{
m_value = ;
m_timer = ;
} private void Update()
{
m_timer += Time.deltaTime * ( / m_duration);
if (m_timer > 1.1f)
//Object.Destroy(this);
this.enabled = false; m_value = m_timer;
} void OnDisable()
{
if (m_material)
{
DestroyImmediate(m_material);
}
}
}
使用方法同“震屏”(同上)
资源链接:
链接:https://pan.baidu.com/s/1ZcSskWxi3wMgYOU9rg4o-g 密码:vzfn
修改:
1.Ondisable 中注释掉 DestroyImmediate() 函数!不需要销毁材质!
Shader 屏幕后期特效 Shake(震屏)&Wave(波纹)的更多相关文章
- fullpage 单屏高度超过屏幕高度,实现单屏内可以滚动并解决手机端单屏高度不正确的问题
最近接触了好几次jquery.fullpage.js这个插件,实现整屏的滑动,效果很炫,用fullpage来实现也很简单,但是也碰到了一些问题和大家分享一下 1.单屏高度超过屏幕高度,实现单屏的滑动 ...
- 一款纯css3实现的发光屏幕旋转特效
今天给大家带来一款纯css3实现的发光屏幕旋转特效.该屏幕由纯css3实现带发光旋转特效,效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class="s ...
- Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度
Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063 ...
- Unity Shader 屏幕后效果——颜色校正
屏幕后效果指的是,当前整个场景图已经渲染完成输出到屏幕后,再对输出的屏幕图像进行的操作. 在Unity中,一般过程通常是: 1.建立用于处理效果的shader和临时材质,给shader脚本传递需要控制 ...
- 用VBox虚拟机安装Android 屏幕90度翻转竖屏设置
在虚拟机中安装好Android之后,有一些Android应用(比如UC浏览器.UC桌面)不能安装.但更有一些程序是可以安装,却自动顺时间旋转了90度,操作和看起来非常不爽! 这个情况下,在Androi ...
- Android 判断当前屏幕是横屏还是竖屏
记录学习 /** * 返回当前屏幕是否为竖屏. * @param context * @return 当且仅当当前屏幕为竖屏时返回true,否则返回false. */ public s ...
- 迅为-ARM嵌入式开发一体化工业9.7寸屏幕 平板式智能触控屏
产品名称:迅为9.7寸IPS高清屏幕 适用于:[iTOP-4412精英版][iTOP-4412全能版][iTOP-4418开发板][迅为-iMX6开发板] 分辨率:1024*768 触摸屏类型:电容屏 ...
- C# 图像处理:复制屏幕到内存中,拷屏操作
/// <summary> /// 复制屏幕到内存中 /// </summary> /// <returns>返回内存流</returns> publi ...
- 如何确定拍照时,相机屏幕是横屏or竖屏?
http://www.eoeandroid.com/thread-80028-1-1.html TAG_DATETIME时间日期 TAG_FLASH闪光灯 TAG_GPS_LATITUDE纬度 TAG ...
随机推荐
- Servlet第二篇(介绍、ServletConfig;ServletContext)
什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...
- Ubuntu 16.04 上安装 PCL 1.8.0
Ubuntu16.04之后安装pcl可以直接apt-get sudo apt-get install libpcl-dev pcl-tools 安装之前,准备一些依赖库 sudo apt-get up ...
- html模板导出pdf文件
package com.crc.commonreport.util; import java.awt.Insets; import java.io.ByteArrayOutputStream; imp ...
- Mac 怎么通过自带终端连接linux服务器
简单来说,就两步骤 · 打开Mac终端,切换到root权限下 切换root权限: sudo -i ·通过ssh命令连接linux服务器 ssh root@127.0.0.1 root是账户名,@后面的 ...
- 通过PHP调用微信JSSDK实例
JSSDK使用步骤: 1. 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 2. 采用http GET方式请求获得access_token(有效期7200秒). 3. ...
- 20175325 MyCP (课下作业,必做)
20175325 MyCP (课下作业,必做) 一.目录: 题目 设计思路 运行结果 码云链接 二.题目 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两 ...
- bittorrent 学习(三) MSG
msg.c中 int转化 char[4] char[4]转化int的函数 如下(有多种方案) ]) { c[] = i % ; c[] = (i - c[]) / % ; c[] = (i - c[ ...
- 《修炼之道:.NET开发要点精讲》读书笔记(一)
CLR 公共语言运行库 没有CLR的存在,就不能讲该中间件转换成对应操作系统中的机器指令. 程序集是非完全编译的产物,它兼备了源代码和本地代码的特性,是一种介于源代码和本地代码之间的独立存在的一种数据 ...
- HTML5-桌面提醒功能
window.webkitNotifications.requestPermission(); statue = window.webkitNotifications.checkPermission( ...
- 分享一个mac for redis-desktop-manager破解版安装包
链接: https://pan.baidu.com/s/1BDndGmBlWoSr4hVLpF3FVw 提取码: wwir