Unity5.0 Shader 极简入门 (五)

来源:互联网 发布:广告公司免费记账软件 编辑:程序博客网 时间:2024/06/06 03:13

屏幕叠贴图特效
屏幕叠图特效

准备文件:
一个名为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一栏里面。
这里写图片描述

这时候运行游戏吧,就可以看到效果了

这里写图片描述

原创粉丝点击