Unity3D Shader 空气扭动效果
//预览图

//原理
一个摄像机CullingMask设置只可见"Distortion"的Layer(需要自己手动加),输入到一张RenderTexture,其实就是用于确定哪里要扭曲。
另外一个摄像机CullingMask设置成对除了"Distortion"的Layer可见,并挂上后期效果脚本。
//Shader代码
Shader "Hidden/Distortion"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Noise ("Noise", 2D) = "black" {}
_DistortionMask ("Distortion Mask", 2D) = "black" {}
_DistortionStrength ("Distortion Strength", Float) = 0.1
_DistortTimeFactor ("_Distort Time Factor", Float) = 0.1
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
return o;
} sampler2D _MainTex; sampler2D _DistortionMask;
sampler2D _Noise;
float _DistortionStrength;
float _DistortTimeFactor; fixed4 frag (v2f i) : SV_Target
{
//wave strength
fixed strength = tex2D(_DistortionMask, i.uv).r; //noise
fixed2 noi = tex2D(_Noise, i.uv-fixed2(,_Time.y * _DistortTimeFactor)); //uv offset
fixed2 uvOffset = strength*noi.xy*_DistortionStrength; fixed4 col = tex2D(_MainTex, i.uv.xy+uvOffset.xy); return col;
}
ENDCG
}
}
}
//C#代码
using UnityEngine;
using System.Collections; [ExecuteInEditMode]
public class DistortionPostEffect : MonoBehaviour
{
private Camera distortionCam;
public Material DistortionMat;
private RenderTexture rt;
void Awake()
{
Transform go = transform.Find("Distortion");
if (null == go) {
go = (new GameObject ("Distortion")).transform;
}
go.transform.parent = transform;
go.transform.localPosition = Vector3.zero;
go.transform.rotation = Quaternion.identity; distortionCam = go.GetComponent<Camera> ();
if (null == distortionCam) {
distortionCam = go.gameObject.AddComponent<Camera> ();
}
distortionCam.clearFlags = CameraClearFlags.Color;
distortionCam.backgroundColor = Color.black;
//rt = RenderTexture.GetTemporary (Screen.width / 2, Screen.height / 2);
rt = RenderTexture.GetTemporary ( , );
rt.wrapMode = TextureWrapMode.Repeat;
distortionCam.targetTexture = rt;
distortionCam.cullingMask = LayerMask.GetMask ("Distortion"); gameObject.GetComponent<Camera> ().cullingMask &= (~distortionCam.cullingMask);
}
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () { } void OnRenderImage(RenderTexture src,RenderTexture dest)
{
DistortionMat.SetTexture ("_DistortionMask", rt);
Graphics.Blit (src, dest, DistortionMat);
} }
Unity3D Shader 空气扭动效果的更多相关文章
- Unity3D Shader 马赛克后期效果
//效果图 //Shader代码 Shader "Hidden/Mosaic" { Properties { _MainTex ("Texture", 2D) ...
- Unity3D Shader 模型流光效果
Shader "Custom/FlowColor" { Properties { _MainTex ("Base (RGB)", 2D) = "whi ...
- unity3D 涂涂乐使用shader实现上色效果
unity3D 涂涂乐使用shader实现上色效果 之前我博文里面发过一个简单的通过截图方式来实现的模型上色方法,但是那个方法不合适商用,因为你需要对的很准确才可以把贴图完美截取下来,只要你手抖了一下 ...
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- Unity3D shader简介
Unity3D shader简介 可以肯定的说Unity3D使得很多开发者开发游戏更容易.毫无疑问,shader(着色器)编码,仍有很长的路要走.shader是一个专门运行在GPU的程序,经常被神秘包 ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 转 猫都能学会的Unity3D Shader入门指南(二)
猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...
- Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
随机推荐
- Android NDK 使用自己的共享库(Import Module)
LOCAL_PATH := $(call my-dir)//标准mk语句,指编译路径,所有mk文件第一句都是这个 /**这个模块表示引用了一个本地的静态库include $(CLEAR_VARS) / ...
- Altium Designer 13 安装完整元件库
Altium Designer更新的非常快,都快赶上chrome了,13出来没多久14又出来了,之前一直用AD9.4,算是10之前的最后一个版本,也是很经典的一个版本.安装新版本后看到在目录结构上有些 ...
- android-activity生命周期方法
整个Activity生命周期中的所有方法,我们可以根据程序的需要来覆盖相应的方法: public class Activity extends ApplicationContext { //创建的时候 ...
- Java多线程学习(吐血超详细总结)(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但 ...
- WebSocket——为Web应用带来桌面应用般的灵活性【转载+整理】
原文地址 本文内容 WebSocket 简介 浏览器端的 JavaScript 实现 Java 端的 WebSocket 实现 对 Web 应用的重新思考 使用WebSocket时所需注意的要点 We ...
- 亿级 Web 系统搭建:单机到分布式集群
本文内容 Web 负载均衡 HTTP 重定向 反向代理 IP 负载均衡 DNS 负载均衡 Web 系统缓存机制的建立和优化 MySQL 数据库内部缓存 搭建多台 MySQL 数据库 MySQL 数据库 ...
- JVM内存区域的划分(内存结构或者内存模型)
JVM内存区域的划分(内存结构或者内存模型) 运行时数据区域: 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器(线程私有): 是当前线程所 ...
- JAVA四则运算字符串解释器
最近学习到后缀表达式,于是基于后缀表达式的思想,写了一个四则运算解释器,输入字符串类型的四则运算表达式,可以直接得到结果,支持括号嵌套. 实现时主要考虑以下两点: 字符串中运算符和数字分离 运算符优先 ...
- 【转】Java异常总结和Spring事务处理异常机制浅析
异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误.本文主要讲授的是Java语言的异常处理.Java语言的异常处理框架,是Java语言健壮性的一个重要体现. Thorwable类所有异常 ...
- 【LeetCode-面试算法经典-Java实现】【062-Unique Paths(唯一路径)】
[062-Unique Paths(唯一路径)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 A robot is located at the top-left c ...