Hiệu ứng ba chiều trong Unity

Hình ba chiều là hình chiếu ba chiều của một vật thể hoặc một người lên khu vực gần đó bằng cách sử dụng một kỹ thuật gọi là giao thoa chùm ánh sáng.

Mặc dù không có hình ba chiều thực sự nào tồn tại, nhưng khái niệm này phần lớn đã được phổ biến rộng rãi qua các bộ phim và tiểu thuyết thuộc thể loại khoa học viễn tưởng.

Trong hướng dẫn này, tôi sẽ hướng dẫn cách tạo một Shader ảnh ba chiều với hiệu ứng trục trặc trong Unity.

Sharp Coder Trình phát video

Kiểm tra cái này Horizon Bending Shader

Bước 1: Tạo bóng ba chiều

Hiệu ứng hình ba chiều được thực hiện với sự trợ giúp của Shader tùy chỉnh.

Để tạo Shader ảnh ba chiều, hãy làm theo các bước dưới đây:

  • Tạo một Shader mới và đặt tên cho nó "Hologram"
  • Xóa mọi thứ bên trong rồi dán mã bên dưới:

Hình ba chiều.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
		}
	}
}

Bước 2: Gán Shader cho Material

Với mục đích trình diễn, tôi sẽ sử dụng Space Robot Kyle.

Robot không gian Kyle

Để gán Shader ảnh ba chiều cho vật liệu, hãy làm theo các bước dưới đây:

  • Tạo một Material mới và đặt tên cho nó "hologram_material"
  • Gán một Shader mới được tạo cho nó, nó sẽ được đặt tại 'FX/Hologram Shader'

Thanh tra vật liệu Unity 3D

  • Về Màu sắc tôi sẽ chọn Lục lam (0, 1, 1, 1) nhưng bạn có thể chọn bất kỳ màu nào

  • Đối với Base (RGB), chỉ định Họa tiết đi kèm với mô hình

  • Gán Vật liệu cho mô hình 3D của bạn

Nhưng như bạn sẽ thấy, Mô hình trông không giống một Hình ba chiều cho lắm, đó là vì chúng ta cần gán một Họa tiết cuối cùng là Alpha Mask (R).

Trong trường hợp của tôi, tôi sẽ sử dụng một kết cấu đơn giản với các sọc ngang và độ trong suốt (để thêm hiệu ứng "Holographic segmentation" đó).

  • Kiểm tra kết cấu dưới đây:

  • Gán Họa tiết ở trên cho Mặt nạ Alpha (R)

Tốt hơn nhiều, bây giờ mô hình trông giống Ảnh ba chiều hơn!

Bước 3: Thêm hiệu ứng trục trặc

Trình tạo ảnh ba chiều cũng hỗ trợ hiệu ứng trục trặc có thể được điều khiển từ tập lệnh.

Để thêm hiệu ứng trục trặc vào Shader ảnh ba chiều, hãy làm theo các bước bên dưới:

  • Tạo một tập lệnh mới và đặt tên cho nó "GlitchControl"
  • Sao chép mã bên dưới vào bên trong nó:

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;
        }
    }
}

  • Đính kèm tập lệnh GlitchControl vào cùng GameObject với thành phần Trình kết xuất có vật liệu 'hologram_material'.
  • Nhấn Play và quan sát hiệu ứng trục trặc:

Bài viết được đề xuất
Triển khai hiệu ứng hạt trong Unity
Tạo hiệu ứng bộ lọc băng VHS trong Unity
Tạo hiệu ứng bọt máy rửa áp lực trong Unity
Tạo mô phỏng chuyến bay trong Unity
Sức mạnh của kết cấu giữ chỗ để tạo nguyên mẫu trong Unity
Cách tạo cookie nhẹ trong Unity
Hướng dẫn tạo hiệu ứng phát sáng đối tượng cho Unity