Unity5.0 Shader 极简入门 (五)

屏幕叠贴图特效

准备文件:
一个名为asd的贴图一张,
一个C#特效脚本,
一个简单的特效shader。
Unity5.0 Shader 极简入门 (五)_第1张图片

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一栏里面。
Unity5.0 Shader 极简入门 (五)_第2张图片

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

Unity5.0 Shader 极简入门 (五)_第3张图片

你可能感兴趣的:(UnityShader)