Nabewerkingshandleiding voor nachtzichtbeeldeffecten voor Unity
In deze tutorial laat ik zien hoe je een nachtzichteffect creëert in Unity.
Nachtzicht is een beeldeffect dat de zichtbaarheid bij weinig licht verbetert. Het effect wordt vaak gebruikt in videogames om een echte nachtkijker na te bootsen.
Voor demonstratiedoeleinden gebruik ik de Small Cave Kit van de Asset Store.
Om een nachtzichteffect te maken in Unity gebruiken we een speciale Shader en een nabewerkingsscript.
Stap 1: Maak de afbeeldingseffectshader
Het afbeeldingseffect zelf wordt gedaan met behulp van een aangepaste Shader.
- Maak een nieuwe Shader (Maken -> Shader -> Afbeeldingseffect Shader) en geef deze een naam "NightVisionShader"
- Verwijder alles erin en plak de onderstaande code:
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
}
Stap 2: Maak het naverwerkingsscript
Het naverwerkingsscript gebruikt de functie Unity's OnRenderImage om de RenderTexture van het scherm te verkrijgen en voert deze vervolgens in materiaal in dat een NightVision Shader gebruikt.
- Maak een nieuw script en geef het een naam "NightVisionImageEffect"
- Plak de onderstaande code erin:
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);
}
}
}
- Voeg het NightVisionImageEffect-script toe aan elke camera
- Wijs de Shader-variabele toe met een nieuw gemaakte NightVision Shader
Tip: Pas de schuifregelaars Luminantie en Lensradius aan om het gewenste effect te bereiken
Het nachtzichtbeeldeffect is nu gereed.
Voor:
Na:
Alles werkt zoals verwacht.