Tutoriel de post-traitement des effets d'image de vision nocturne pour Unity

Dans ce tutoriel, je vais montrer comment créer un effet de vision nocturne dans Unity.

La vision nocturne est un effet d'image qui améliore la visibilité dans des environnements de faible luminosité. Cet effet est souvent utilisé dans les jeux vidéo pour imiter les lunettes de vision nocturne réelles.

À des fins de démonstration, j'utiliserai le Kit petite grotte du Asset Store.

Kit petite grotte

Pour créer un effet de vision nocturne dans Unity, nous utiliserons un Shader spécial et un script de post-traitement.

Étape 1: Créer le shader d'effet d'image

L'effet d'image lui-même est réalisé à l'aide d'un Shader personnalisé.

  • Créez un nouveau Shader (Créer -> Shader -> Image Effect Shader) et nommez-le "NightVisionShader"

  • Supprimez tout ce qu'il contient puis collez le code ci-dessous:

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
}

Étape 2: Créer le script de post-traitement

Le script de post-traitement utilisera la fonction Unity's OnRenderImage pour obtenir la RenderTexture de l'écran, puis l'introduira dans un matériau qui utilisera un NightVision Shader.

  • Créez un nouveau script et nommez-le "NightVisionImageEffect"
  • Collez le code ci-dessous à l'intérieur:

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);
        }
    }
}
  • Attachez le script NightVisionImageEffect à n'importe quelle caméra
  • Attribuez la variable Shader avec un Shader NightVision nouvellement créé

Astuce: Ajustez les curseurs Luminance et Lens Radius pour obtenir l'effet souhaité.

Sharp Coder Lecteur vidéo

L'effet d'image de vision nocturne est maintenant prêt.

Avant:

Après:

Call of Duty: Vision nocturne de Modern Warfare

Tout fonctionne comme prévu.

Articles suggérés
Implémentation d'effets de particules dans Unity
Puissance des textures d'espace réservé pour le prototypage dans Unity
Comment créer des cookies légers dans Unity
Extensions indispensables pour améliorer la conception des niveaux dans Unity
Créer un effet de mousse pour nettoyeur haute pression dans Unity
Création d'un effet de filtre de bande VHS dans Unity
Comment créer des graphiques rétro de type PS1 dans Unity