Tutorial zur Nachbearbeitung von Nachtsicht-Bildeffekten für Unity

In diesem Tutorial zeige ich, wie man in Unity einen Nachtsichteffekt erstellt.

Nachtsicht ist ein Bildeffekt, der die Sichtbarkeit bei schlechten Lichtverhältnissen verbessert. Der Effekt wird häufig in Videospielen verwendet, um echte Nachtsichtbrillen nachzuahmen.

Zu Demonstrationszwecken verwende ich das Small Cave Kit aus Asset Store.

Kleines Höhlenset

Um in Unity einen Nachtsichteffekt zu erzeugen, verwenden wir einen speziellen Shader und ein Nachbearbeitungsskript.

Schritt 1: Erstellen Sie den Bildeffekt-Shader

Der Bildeffekt selbst wird mit Hilfe eines benutzerdefinierten Shaders erstellt.

  • Erstellen einen neuen Shader (Erstellen -> Shader -> Bildeffekt-Shader) und benennen Sie ihn "NightVisionShader"

  • Entfernen Sie alles darin und fügen Sie dann den folgenden Code ein:

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
}

Schritt 2: Erstellen Sie das Nachbearbeitungsskript

Das Nachbearbeitungsskript verwendet die Funktion Unity's OnRenderImage, um die RenderTexture des Bildschirms abzurufen und sie dann in Material einzuspeisen, das einen NightVision-Shader verwendet.

  • Erstellen ein neues Skript und benennen Sie es "NightVisionImageEffect"
  • Fügen Sie den folgenden Code ein:

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);
        }
    }
}
  • Hängen Sie das NightVisionImageEffect-Skript an eine beliebige Kamera an
  • Weisen Sie der Shader-Variable einen neu erstellten NightVision-Shader zu

Tipp: Passen Sie die Schieberegler „Luminanz“ und „Linsenradius“ an, um den gewünschten Effekt zu erzielen

Sharp Coder Videoplayer

Der Nachtsicht-Bildeffekt ist jetzt fertig.

Vor:

Nach:

Call of Duty: Modern Warfare Nachtsicht

Alles funktioniert wie erwartet.