Effetto ologramma nell'unità

L'ologramma è una proiezione tridimensionale di un oggetto o di una persona su un'area vicina, utilizzando una tecnica chiamata intersezione del raggio di luce.

Anche se non esistono veri ologrammi, il concetto è stato ampiamente reso popolare da film e romanzi del genere fantascientifico.

In questo tutorial, mostrerò come creare uno Shader ologramma con un effetto glitch in Unity.

Sharp Coder Lettore video

Controlla questo Horizon Bending Shader

Passaggio 1: crea lo shader dell'ologramma

L'effetto ologramma viene eseguito con l'aiuto di uno Shader personalizzato.

Per creare uno shader ologramma, procedi nel seguente modo:

  • Crea un nuovo Shader e assegnagli un nome "Hologram"
  • Rimuovi tutto al suo interno quindi incolla il codice qui sotto:

Ologramma.shader

//sharpcoderblog.com @2019
Shader "FX/Hologram Shader"
{
	Properties
	{
		_Color("Color", Color) = (0, 1, 1, 1)
		_MainTex("Base (RGB)", 2D) = "white" {}
		_AlphaTexture ("Alpha Mask (R)", 2D) = "white" {}
		//Alpha Mask Properties
		_Scale ("Alpha Tiling", Float) = 3
		_ScrollSpeedV("Alpha scroll Speed", Range(0, 5.0)) = 1.0
		// Glow
		_GlowIntensity ("Glow Intensity", Range(0.01, 1.0)) = 0.5
		// Glitch
		_GlitchSpeed ("Glitch Speed", Range(0, 50)) = 50.0
		_GlitchIntensity ("Glitch Intensity", Range(0.0, 0.1)) = 0
	}

	SubShader
	{
		Tags{ "Queue" = "Overlay" "IgnoreProjector" = "True" "RenderType" = "Transparent" }

		Pass
		{
			Lighting Off 
			ZWrite On
			Blend SrcAlpha One
			Cull Back

			CGPROGRAM
				
				#pragma vertex vertexFunc
				#pragma fragment fragmentFunc

				#include "UnityCG.cginc"

				struct appdata{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
					float3 normal : NORMAL;
				};

				struct v2f{
					float4 position : SV_POSITION;
					float2 uv : TEXCOORD0;
					float3 grabPos : TEXCOORD1;
					float3 viewDir : TEXCOORD2;
					float3 worldNormal : NORMAL;
				};

				fixed4 _Color, _MainTex_ST;
				sampler2D _MainTex, _AlphaTexture;
				half _Scale, _ScrollSpeedV, _GlowIntensity, _GlitchSpeed, _GlitchIntensity;

				v2f vertexFunc(appdata IN){
					v2f OUT;

					//Glitch
					IN.vertex.z += sin(_Time.y * _GlitchSpeed * 5 * IN.vertex.y) * _GlitchIntensity;

					OUT.position = UnityObjectToClipPos(IN.vertex);
					OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);

					//Alpha mask coordinates
					OUT.grabPos = UnityObjectToViewPos(IN.vertex);

					//Scroll Alpha mask uv
					OUT.grabPos.y += _Time * _ScrollSpeedV;

					OUT.worldNormal = UnityObjectToWorldNormal(IN.normal);
					OUT.viewDir = normalize(UnityWorldSpaceViewDir(OUT.grabPos.xyz));

					return OUT;
				}

				fixed4 fragmentFunc(v2f IN) : SV_Target{
					
					half dirVertex = (dot(IN.grabPos, 1.0) + 1) / 2;
					
					fixed4 alphaColor = tex2D(_AlphaTexture,  IN.grabPos.xy * _Scale);
					fixed4 pixelColor = tex2D (_MainTex, IN.uv);
					pixelColor.w = alphaColor.w;

					// Rim Light
					half rim = 1.0-saturate(dot(IN.viewDir, IN.worldNormal));

					return pixelColor * _Color * (rim + _GlowIntensity);
				}
			ENDCG
		}
	}
}

Passaggio 2: assegna lo shader al materiale

A scopo dimostrativo, userò il Space Robot Kyle.

Il robot spaziale Kyle

Per assegnare un ologramma Shader a un materiale, procedi nel seguente modo:

  • Crea un nuovo Materiale e assegnagli un nome "hologram_material"
  • Assegnagli uno Shader appena creato, che dovrebbe trovarsi in 'FX/Hologram Shader'

Ispettore dei materiali Unity 3D

  • Per il colore sceglierò Cyan (0, 1, 1, 1) ma puoi scegliere qualsiasi colore

  • Per Base (RGB) assegna una Texture fornita con il modello

  • Assegna il materiale al tuo modello 3D

Ma come noterai, il Modello non assomiglia molto a un Ologramma, questo perché dobbiamo assegnare un'ultima Texture che è Alpha Mask (R).

Nel mio caso, userò una texture semplice con strisce orizzontali e trasparenza (per aggiungere quell'effetto "Holographic segmentation").

  • Controlla la trama qui sotto:

  • Assegna una trama sopra alla maschera alfa (R)

Molto meglio, ora il modello sembra più un ologramma!

Passaggio 3: aggiungi l'effetto Glitch

L'ologramma Shader supporta anche un effetto glitch che può essere controllato da uno script.

Per aggiungere un effetto glitch a uno shader ologramma, procedi nel seguente modo:

  • Crea un nuovo script e assegnagli un nome "GlitchControl"
  • Copia il codice qui sotto al suo interno:

GlitchControl.cs

using System.Collections;
using UnityEngine;

public class GlitchControl : MonoBehaviour
{
    //How often should the glitch effect happen (higher value means more frequently)
    public float glitchChance = 0.1f;

    Material hologramMaterial;
    WaitForSeconds glitchLoopWait = new WaitForSeconds(0.1f);

    void Awake()
    {
        hologramMaterial = GetComponent<Renderer>().material;
    }

    // Start is called before the first frame update
    IEnumerator Start()
    {
        while (true)
        {
            float glitchTest = Random.Range(0f, 1f);

            if (glitchTest <= glitchChance)
            {
                //Do Glitch
                float originalGlowIntensity = hologramMaterial.GetFloat("_GlowIntensity");
                hologramMaterial.SetFloat("_GlitchIntensity", Random.Range(0.07f, 0.1f));
                hologramMaterial.SetFloat("_GlowIntensity", originalGlowIntensity * Random.Range(0.14f, 0.44f));
                yield return new WaitForSeconds(Random.Range(0.05f, 0.1f));
                hologramMaterial.SetFloat("_GlitchIntensity", 0f);
                hologramMaterial.SetFloat("_GlowIntensity", originalGlowIntensity);
            }

            yield return glitchLoopWait;
        }
    }
}

  • Allega lo script GlitchControl allo stesso GameObject del componente Renderer con il materiale 'hologram_material'.
  • Premi Riproduci e osserva l'effetto glitch:

Articoli suggeriti
Implementazione degli effetti particellari in Unity
Creazione di un effetto filtro nastro VHS in Unity
Crea un effetto schiuma per idropulitrice in Unity
Come dipingere con il sistema particellare in Unity
Tutorial sull'effetto bagliore degli oggetti per Unity
Tutorial sulla post-elaborazione degli effetti immagine per la visione notturna per Unity
Creazione di un semplice grass shader in Unity