Unity&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部分其实非常简单,返回一个随着时间变换的黑色即可以,代码如下:

扫描二维码关注公众号,回复: 2160171 查看本文章

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#脚本赋给主摄像机就可以,在控制面板上改变颜色可以实现不同的渐变屏幕色效果。

猜你喜欢

转载自blog.csdn.net/zhangxiao13627093203/article/details/53384846