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