震屏效果


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(波纹)的更多相关文章

  1. fullpage 单屏高度超过屏幕高度,实现单屏内可以滚动并解决手机端单屏高度不正确的问题

    最近接触了好几次jquery.fullpage.js这个插件,实现整屏的滑动,效果很炫,用fullpage来实现也很简单,但是也碰到了一些问题和大家分享一下 1.单屏高度超过屏幕高度,实现单屏的滑动 ...

  2. 一款纯css3实现的发光屏幕旋转特效

    今天给大家带来一款纯css3实现的发光屏幕旋转特效.该屏幕由纯css3实现带发光旋转特效,效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="s ...

  3. Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度

    Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现. 转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063 ...

  4. Unity Shader 屏幕后效果——颜色校正

    屏幕后效果指的是,当前整个场景图已经渲染完成输出到屏幕后,再对输出的屏幕图像进行的操作. 在Unity中,一般过程通常是: 1.建立用于处理效果的shader和临时材质,给shader脚本传递需要控制 ...

  5. 用VBox虚拟机安装Android 屏幕90度翻转竖屏设置

    在虚拟机中安装好Android之后,有一些Android应用(比如UC浏览器.UC桌面)不能安装.但更有一些程序是可以安装,却自动顺时间旋转了90度,操作和看起来非常不爽! 这个情况下,在Androi ...

  6. Android 判断当前屏幕是横屏还是竖屏

       记录学习 /**  * 返回当前屏幕是否为竖屏.  * @param context  * @return 当且仅当当前屏幕为竖屏时返回true,否则返回false.  */  public s ...

  7. 迅为-ARM嵌入式开发一体化工业9.7寸屏幕 平板式智能触控屏

    产品名称:迅为9.7寸IPS高清屏幕 适用于:[iTOP-4412精英版][iTOP-4412全能版][iTOP-4418开发板][迅为-iMX6开发板] 分辨率:1024*768 触摸屏类型:电容屏 ...

  8. C# 图像处理:复制屏幕到内存中,拷屏操作

    /// <summary> /// 复制屏幕到内存中 /// </summary> /// <returns>返回内存流</returns> publi ...

  9. 如何确定拍照时,相机屏幕是横屏or竖屏?

    http://www.eoeandroid.com/thread-80028-1-1.html TAG_DATETIME时间日期 TAG_FLASH闪光灯 TAG_GPS_LATITUDE纬度 TAG ...

随机推荐

  1. vim字符查找和替换

    一.替换 1. r+<待替换的字母>    将光标处的字母替换为指定的字母 2.R       连续替换直到按下ESC 3.cc      整行替换,并进入插入模式 4.cw     替换 ...

  2. checkbox、radio控件和文字不对齐

    一般使用html控件的时候  单选按钮和复选框的控件和文字不对齐 给input控件加上   style="vertical-align: middle; margin-top: -2px; ...

  3. 20175314 《Java程序设计》第八周学习总结

    20175314 <Java程序设计>第八周学习总结 教材学习内容总结 安利一个非常实用的图片处理工具:图片工厂,它具有非常强大的图片批处理能力,比如加水印.降低画质.命名等,不仅如此它还 ...

  4. 100-days: twenty-one

    Title: Not so fantastic(<口>极好的,棒的): can Japan end its love affair(喜爱,热爱) with plastic(塑料)? A : ...

  5. docker mysql 主主同步

    转发自:https://blog.csdn.net/money9sun/article/details/85099134 第一步:安装docker   https://www.cnblogs.com/ ...

  6. 用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。

    应用举例:在屏幕的第12行,显示data段中以0结尾的字符串. assume cs:code data segment db data ends code segment start: mov ax, ...

  7. crontab学习

    概念 日志路径 /var/log/cron 配置路径 vi /etc/crontab 参考 https://www.cnblogs.com/kenshinobiy/p/7685229.html 问题 ...

  8. xmltodict 模块

    pip install xmltodict xmltodict.parse() 方法可以将xml数据转为python中的dict字典数据 xmltodict.unparse() 将字典转换为xml数据 ...

  9. JS学习记录------JS基本指令

    对未来的恐慌,和想成为一名自由开发的梦想.让我觉得应该点亮一个新的技能:WEB前端开发. 重新学习JS以及jQuery,让我在日常code的过程中可以更得心应手,毕竟,我爱代码. 这篇文章主要记录的内 ...

  10. P2880 [USACO07JAN]平衡的阵容Balanced Lineup(RMQ的倍增模板)

    题面:P2880 [USACO07JAN]平衡的阵容Balanced Lineup RMQ问题:给定一个长度为N的区间,M个询问,每次询问Li到Ri这段区间元素的最大值/最小值. RMQ的高级写法一般 ...