屏幕叠贴图特效
准备文件:
一个名为asd的贴图一张,
一个C#特效脚本,
一个简单的特效shader。
C#代码,挂给摄影机的
using UnityEngine;
using System.Collections;
public class E_Screen_001 : MonoBehaviour {
private Material tempMat;
private Texture2D ttt;
public Shader eee;
Material TeXiaoMat
{//先检测有木有生成这个屏幕特效的材质
get
{
//如果没有生成,就先生一个
if (tempMat == null)
{
//生一个临时材质
tempMat = new Material(eee);
//生完不用拿出来看,隐藏在内存里面就行
tempMat.hideFlags = HideFlags.HideAndDontSave;
}
//返回临时材质,以后调用材质就是指的这个临时材质了
return tempMat;
}
}
// Use this for initialization
void Start () {
//初始化时候先载入我们需要的贴图 记住要作为 Texture2D 类型载入,把贴图放在resources文件夹里
ttt = Resources.Load ("asd") as Texture2D;
//将图像贴给材质球的_Tex1通道。 可以在shader中找到这个通道,注意千万不要贴在 _MainTex 通道等专有名词通道上,否则会被覆盖
TeXiaoMat.SetTexture("_Tex1",ttt);
//做一个判断,屏幕特效是否被支持(固定用法,死记硬背)
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
return;
}
//做一个判断,特效shader是否被支持(固定用法,死记硬背)
if (!eee && !eee.isSupported)
{
enabled = false;
}
}
//屏幕渲染 yuantu可以是Texture类型,也可以是RenderTexture,类型。
void OnRenderImage(Texture yuantu, RenderTexture xiaoguotu)
{
//如果特效材质不等于没有(就是正常存在的意思)
if (TeXiaoMat != null)
{
// 输入的原始屏幕图像yuantu,使用TeXiaoMat材质加工完成后,输出xiaoguotu到屏幕
Graphics.Blit(yuantu, xiaoguotu, TeXiaoMat);
}
else
{
//如果没有texiao材质,就什么样来的什么样送出去。
Graphics.Blit(yuantu, xiaoguotu);
}
}
//如果不可见,则销毁临时材质。
void OnDisable()
{
if (tempMat)
DestroyImmediate(tempMat);
}
}
shader代码:
Shader "LiShader/ScreenEffect_Tex"
{
Properties
{
_MainTex ("MainTex", 2D) = "white" {}
//记住这个名字 _Tex
_Tex1("Texture1", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
};
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
//在这里声明一下,C#就可以往shader里面传贴图了
uniform sampler2D _Tex1;
v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//将屏幕特效与贴图进行乘法融合
fixed4 col = tex2D(_MainTex, i.uv) * tex2D(_Tex1, i.uv);
return col;
}
ENDCG
}
}
}
然后把C#挂给摄影机,把shader仍在Eee一栏里面。
这时候运行游戏吧,就可以看到效果了