Tutorial de posprocesamiento de efectos de imagen de visión nocturna para Unity

En este tutorial, mostraré cómo crear un efecto de visión nocturna en Unity.

La visión nocturna es un efecto de imagen que mejora la visibilidad en entornos con poca luz. El efecto se utiliza a menudo en videojuegos para imitar las gafas de visión nocturna de la vida real.

Para fines de demostración, usaré el Kit de cueva pequeña de Asset Store.

Kit de cueva pequeña

Para crear un efecto de visión nocturna en Unity usaremos un Shader especial y un script de posprocesamiento.

Paso 1: crea el sombreador de efectos de imagen

El efecto de la imagen en sí se realiza con la ayuda de un Shader personalizado.

  • Cree un nuevo Shader (Crear -> Shader -> Image Effect Shader) y asígnele un nombre "NightVisionShader"

  • Elimina todo lo que contiene y luego pega el siguiente código:

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
}

Paso 2: cree el script de posprocesamiento

El script de posprocesamiento utilizará la función Unity's OnRenderImage para obtener la RenderTexture de la pantalla y luego la introducirá en el material que utilizará un NightVision Shader.

  • Crea un nuevo script y asígnale un nombre "NightVisionImageEffect"
  • Pegue el siguiente código dentro de él:

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);
        }
    }
}
  • Adjunte el script NightVisionImageEffect a cualquier cámara
  • Asigne la variable Shader con un NightVision Shader recién creado

Consejo: Modifica los controles deslizantes de Luminancia y Radio de la lente para lograr el efecto deseado

Sharp Coder Reproductor de video

El efecto de imagen de visión nocturna ya está listo.

Antes:

Después:

Call of Duty: Modern Warfare Visión nocturna

Todo funciona como se esperaba.