专业的编程技术博客社区

网站首页 > 博客文章 正文

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

baijin 2024-09-02 11:03:20 博客文章 5 ℃ 0 评论

一、前言

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

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表