0评论

Unity Shader案例篇—屏幕渐暗效果

文章来自CSDN博客 2018-06-12 107浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏开发行业精英群711501594

本文和大家介绍使用shader实现屏幕渐暗效果的案例,使用的版本为Unity5.3.3,并且两种实现方法得到的效果是一样的,只是两者的侧重点不一样,大家可以选择最适合自己的方法去使用即可。

一、第一种方案

1、效果图如图所示

2、制作步骤

首先是C#脚本部分,前面的几章基础篇里面已经提到过这个脚本了,代码如下:
using UnityEngine;  
using System.Collections;  
public class OVRScreenFade2 : MonoBehaviour  
{  
    [SerializeField]  
    private Material m_Material;  
    // Use this for initialization  
    void Start()  
    {  
    }  
    // Update is called once per frame  
    void Update()  
    {  
    }  
    void OnRenderImage(RenderTexture src, RenderTexture dest)  
    {  
        Graphics.Blit(src, dest, m_Material);  
    }  
}  

这个脚本可以直接将材质中的效果渲染到屏幕的最上层中,也就是说,材质中的效果是最前端的。这样用在VR程序中也可以实现屏幕的渐变暗的效果,实现一些场景的转换时候的过渡效果。

Shader部分其实非常简单,返回一个随着时间变换的黑色即可以,代码如下:
Shader "UnityCg/OVRScreenFade2"  
{  
    Properties  
    {  
        _MainTex("Texture", 2D) = "white" {}  
    }  
        SubShader  
    {  
        // No culling or depth  
        Cull Off ZWrite On 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;  
    }  
    uniform float _Timer;  
    uniform sampler2D _MainTex;  
    fixed4 frag(v2f i) : SV_Target  
    {  
        fixed4 col = tex2D(_MainTex, i.uv);  
    fixed4 black = 1 - fixed4(_Time.yyy / 2, 1);  
    col *= black;  
    return col;  
    }  
        ENDCG  
    }  
    }  
}  

将上面的C#脚本赋给主摄像机,并将附有上述Shader的材质赋给脚本中的“m_Material”变量

二、第二种方案

1、效果图如图所示

2、这个方法的Shader部分相比来说更加的简单,代码如下:
Shader "Unlit/OVRScreenFade"  
{  
    Properties{  
        _Color("Color", Color) = (0,0,0,1)  
    }  
        SubShader{  
        Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Opaque" }  
        LOD 100  
        ZWrite Off  
        Blend SrcAlpha OneMinusSrcAlpha  
        Color[_Color]  
        Pass{}  
    }  
}

3、主要部分在C#脚本,脚本中通过代码来添加Pass块实现渲染的部分,并通过GL类进行最终的绘制,代码如下:
using UnityEngine;  
using System.Collections;  
public class OVRScreenFade : MonoBehaviour {  
    public float fadeTime = 2.0f;  
    public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1.0f);  
    private Material fadeMaterial = null;  
    private bool isFading = false;  
    private YieldInstruction fadeInstruction = new WaitForEndOfFrame();  
    void Awake()  
    {  
        fadeMaterial = new Material(Shader.Find("Unlit/OVRScreenFade"));  
    }  
    void OnEnable()  
    {  
        StartCoroutine(FadeIn());  
    }  
    void OnLevelWasLoaded(int level)  
    {  
        StartCoroutine(FadeIn());  
    }  
    void OnDestroy()  
    {  
        if (fadeMaterial != null)  
        {  
            Destroy(fadeMaterial);  
        }  
    }  
    IEnumerator FadeIn()  
    {  
        float elapsedTime = 0.0f;  
        fadeMaterial.color = fadeColor;  
        Color color = fadeColor;  
        isFading = true;  
        while (elapsedTime < fadeTime)  
        {  
            yield return fadeInstruction;  
            elapsedTime += Time.deltaTime;  
            color.a = 1.0f - Mathf.Clamp01(elapsedTime / fadeTime);  
            fadeMaterial.color = color;  
        }  
        isFading = false;  
    }  
    void OnPostRender()  
    {  
        if (isFading)  
        {  
            fadeMaterial.SetPass(0);  
            GL.PushMatrix();  
            GL.LoadOrtho();  
            GL.Color(fadeMaterial.color);  
            GL.Begin(GL.QUADS);  
            GL.Vertex3(0f, 0f, -12f);  
            GL.Vertex3(0f, 1f, -12f);  
            GL.Vertex3(1f, 1f, -12f);  
            GL.Vertex3(1f, 0f, -12f);  
            GL.End();  
            GL.PopMatrix();  
        }  
    }  
}  

同样的将这个C#脚本赋给主摄像机就可以,在控制面板上改变颜色可以实现不同的渐变屏幕色效果。

来自:凯尔八阿哥专栏https://blog.csdn.net/zhangxiao13627093203/article/details/53384846