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

本文介绍两种在Unity中实现VR程序屏幕渐变效果的方法。第一种使用C#脚本结合自定义Shader;第二种利用C#脚本动态添加Pass块并通过GL类绘制。这两种方法均可实现场景过渡时的渐变暗效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文http://www.manew.com/thread-97757-1-1.html

一、前言

两种实现方法得到的效果是一样的,侧重点不一样,择其良者而用之。

二、第一种方案

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
{
    [SerializeField]
    private Material m_Material;

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


好了,感谢原作者的分享。

每天进步一点点!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值