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.
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
El efecto de imagen de visión nocturna ya está listo.
Antes:
Después:
Todo funciona como se esperaba.