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 変数に割り当てます。
ヒント: 希望の効果を得るには、輝度スライダーとレンズ半径スライダーを微調整します。
ナイトビジョン画像効果の準備が整いました。
前に:
後:
すべてが期待どおりに機能します。