Tutorial de post-procesare cu efect de imagine pentru vedere nocturnă pentru Unity

În acest tutorial, voi arăta cum să creez un efect de vedere nocturnă în Unity.

Viziunea pe timp de noapte este un efect de imagine care îmbunătățește vizibilitatea în condiții de lumină scăzută. Efectul este adesea folosit în jocurile video pentru a imita ochelarii de vedere pe timp de noapte din viața reală.

În scopuri demonstrative, voi folosi Small Cave Kit de la Asset Store.

Kit peșteră mică

Pentru a face un efect de viziune nocturnă în Unity, vom folosi un Shader special și un script de post-procesare.

Pasul 1: Creați umbrirea efectului de imagine

Efectul de imagine în sine este realizat cu ajutorul unui Shader personalizat.

  • Creați un nou Shader (Creare -> Shader -> Image Effect Shader) și denumiți-l "NightVisionShader"

  • Îndepărtați tot ce este în interior, apoi lipiți codul de mai jos:

NightVisionShader.shader

Shader "Hidden/Night Vision" {
 
	Properties {
		_MainTex ("Base (RGB)", RECT) = "white" {}
	}
 
	SubShader {
		Pass {
			ZTest Always Cull Off ZWrite Off
			Fog { Mode off }
 
			CGPROGRAM
				#pragma vertex vert_img
				#pragma fragment frag
				#pragma fragmentoption ARB_precision_hint_fastest 
				#include "UnityCG.cginc"
 
				// frag shaders data
				uniform sampler2D _MainTex;
				uniform float4 _Luminance;
				uniform float _LensRadius;
 
				// frag shader
				float4 frag (v2f_img i) : COLOR
				{	
 
					float4 col = tex2D(_MainTex, i.uv);
 
					//obtain luminance value
					col = dot(col, _Luminance);
 
					//add lens circle effect
					//(could be optimised by using texture)
					float dist = distance(i.uv, float2(0.5, 0.5));
					col *= smoothstep( _LensRadius,  _LensRadius - 0.34, dist);
 
					//add rb to the brightest pixels
					col.r = max (col.r - 0.75, 0) * 4;
 
					// return col pixel	
					return col;
				}
			ENDCG
 
		}
	}
 
	Fallback off
}

Pasul 2: Creați scriptul de post-procesare

Scriptul de post-procesare va folosi funcția Unity's OnRenderImage pentru a obține RenderTexture a ecranului, apoi o va introduce în material care va folosi NightVision Shader.

  • Creați un nou script și denumiți-l "NightVisionImageEffect"
  • Lipiți codul de mai jos în el:

NightVisionImageEffect.cs

using UnityEngine;

[RequireComponent(typeof(Camera))]
[ExecuteInEditMode]

public class NightVisionImageEffect : MonoBehaviour
{
    // Public data
    public Shader shader;
    [Range(0f, 1f)]
    public float luminance = 0.44f;
    [Range(0.5f, 1f)]
    public float lensRadius = 0.84f;
    // Private data
    Material material;

    // Called by Camera to apply image effect
    void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (shader != null)
        {
            if (!material)
            {
                material = new Material(shader);
            }
            material.SetVector("_Luminance", new Vector4(luminance, luminance, luminance, luminance));
            material.SetFloat("_LensRadius", lensRadius);
            Graphics.Blit(source, destination, material);
        }
        else
        {
            Graphics.Blit(source, destination);
        }
    }
}
  • Atașați scriptul NightVisionImageEffect la orice cameră
  • Atribuiți variabila Shader cu un NightVision Shader nou creat

Sfat: Ajustați glisoarele Luminanță și Raza lentilei pentru a obține efectul dorit

Sharp Coder Video player

Efectul de imagine Night Vision este acum gata.

Inainte de:

După:

Call of Duty: Modern Warfare Night Vision

Totul funcționează conform așteptărilor.