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.
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é.
L'effet d'image de vision nocturne est maintenant prêt.
Avant:
Après:
Tout fonctionne comme prévu.