Tutorial de pós-processamento de efeito de imagem de visão noturna para Unity

Neste tutorial, mostrarei como criar um efeito de visão noturna em Unity.

Visão noturna é um efeito de imagem que melhora a visibilidade em ambientes com pouca luz. O efeito é frequentemente usado em videogames para imitar óculos de visão noturna da vida real.

Para fins de demonstração, usarei o Small Cave Kit do Asset Store.

Kit Caverna Pequena

Para criar um efeito de visão noturna em Unity usaremos um Shader especial e um script de pós-processamento.

Etapa 1: crie o sombreador de efeito de imagem

O efeito da imagem em si é feito com a ajuda de um Shader personalizado.

  • Crie um novo Shader (Criar -> Shader -> Image Effect Shader) e nomeie-o "NightVisionShader"

  • Remova tudo dentro dele e cole o código abaixo:

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
}

Etapa 2: crie o script de pós-processamento

O script de pós-processamento usará a função Unity's OnRenderImage para obter a RenderTexture da tela e, em seguida, alimentá-la no material que usará um NightVision Shader.

  • Crie um novo script e nomeie-o "NightVisionImageEffect"
  • Cole o código abaixo dentro dele:

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);
        }
    }
}
  • Anexe o script NightVisionImageEffect a qualquer câmera
  • Atribua a variável Shader com um NightVision Shader recém-criado

Dica: ajuste os controles deslizantes de Luminância e Raio da Lente para obter o efeito desejado

Sharp Coder Reprodutor de vídeo

O efeito de imagem de visão noturna agora está pronto.

Antes:

Depois:

Call of Duty: Modern Warfare Visão Noturna

Tudo funciona conforme o esperado.

Artigos sugeridos
Implementando efeitos de partículas no Unity
Tutorial de efeito de brilho de objeto para Unity
Tutorial de minimapa do tipo visão geral para Unity
Crie um efeito de espuma para lavadora de alta pressão no Unity
Tutorial do Menu Principal para Unity
Criando um efeito de filtro de fita VHS no Unity
Como pintar com sistema de partículas no Unity