Unity のナイト ビジョン画像効果の後処理チュートリアル

このチュートリアルでは、Unity で暗視効果を作成する方法を説明します。

ナイトビジョンは、暗い場所での視認性を高める画像効果です。このエフェクトは、現実の暗視ゴーグルを模倣するためにビデオ ゲームでよく使用されます。

デモンストレーションの目的で、Asset Store の Small Cave Kit を使用します。

小さな洞窟キット

Unity で暗視効果を作成するには、特別なシェーダーと後処理スクリプトを使用します。

ステップ 1: イメージ エフェクト シェーダーを作成する

画像効果自体はカスタム シェーダーを使用して行われます。

  • 新しいシェーダーを作成し (作成 -> シェーダー -> イメージ エフェクト シェーダー)、名前を付けます。 "NightVisionShader"

  • 中身をすべて削除して、以下のコードを貼り付けます。

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
}

ステップ 2: 後処理スクリプトを作成する

後処理スクリプトは、Unity's OnRenderImage 関数を使用して画面の RenderTexture を取得し、それを NightVision Shader を使用するマテリアルにフィードします。

  • 新しいスクリプトを 作成し、名前を付けます "NightVisionImageEffect"
  • その中に以下のコードを貼り付けます。

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);
        }
    }
}
  • NightVisionImageEffect スクリプトを任意のカメラにアタッチします
  • 新しく作成した NightVision Shader を Shader 変数に割り当てます。

ヒント: 希望の効果を得るには、輝度スライダーとレンズ半径スライダーを微調整します。

Sharp Coder ビデオプレーヤー

ナイトビジョン画像効果の準備が整いました。

前に:

後:

コール オブ デューティ モダン・ウォーフェア ナイト ビジョン

すべてが期待どおりに機能します。

おすすめの記事
Unity でのパーティクル エフェクトの実装
Unity で単純な草シェーダーを作成する
Unity で勝者画面 UI を作成する
Unity での一時停止メニューの作成
Unity でフライト シミュレーターを作成する
Unity で VHS テープ フィルター エフェクトを作成する
Unity プロジェクトに適切な剣モデルの選択