Persatuan Cara Membuat Shader

Shader adalah skrip kecil yang berisi perhitungan matematis dan algoritma untuk menghitung warna setiap piksel yang dirender, berdasarkan input pencahayaan dan konfigurasi Material.

Unity menggunakan Shaders yang ditulis dalam bahasa berikut:

  • Bahasa pemrograman yang disebut HLSL digunakan untuk menulis program shader itu sendiri.
  • Bahasa khusus Unity yang disebut ShaderLab digunakan untuk mendefinisikan objek Shader, yang bertindak sebagai wadah untuk program shader.

Untuk membuat shader di Unity ikuti langkah-langkah di bawah ini:

Buat Shader

  • Klik kanan pada tampilan Proyek -> 'Create' -> 'Shader'

Tergantung pada versi Unity yang Anda gunakan, opsi Shader mungkin berbeda, namun inilah arti dari masing-masing opsi:

  1. 'Standard Surface Shader': Shader ini dirancang untuk bekerja dengan sistem Unity's Rendering Berbasis Fisik (PBR). Hal ini memungkinkan pengembang untuk membuat material yang merespons kondisi pencahayaan secara realistis. Ini mendukung berbagai fitur rendering seperti pemetaan normal, sorotan specular, dan refleksi. Ini adalah shader serbaguna yang memberikan keseimbangan yang baik antara realisme dan kinerja.
  2. 'Unlit Shader': Seperti namanya, shader yang tidak menyala tidak mempertimbangkan kondisi pencahayaan. Ini sering digunakan untuk merender efek yang tidak memerlukan pencahayaan realistis, seperti elemen UI, sistem partikel, atau efek khusus. Shader yang tidak menyala biasanya lebih efisien dan dapat berguna dalam situasi yang memerlukan kontrol penuh atas tampilan suatu objek tanpa perhitungan pencahayaan apa pun.
  3. 'Image Effect Shader': Shader efek gambar digunakan untuk menerapkan efek pasca-pemrosesan ke seluruh layar atau target render tertentu. Mereka mengizinkan pengembang untuk memodifikasi gambar akhir yang dirender setelah rendering utama selesai. Contoh efek gambar mencakup keburaman, gradasi warna, distorsi, atau filter bergaya. Mereka dapat digunakan untuk meningkatkan kualitas visual atau menciptakan efek artistik tertentu.
  4. 'Compute Shader': Compute shader adalah jenis shader yang berjalan pada GPU tetapi tidak beroperasi pada piksel secara langsung. Ini digunakan untuk komputasi tujuan umum pada data paralel, memungkinkan pengembang melakukan penghitungan atau simulasi kompleks secara efisien. Compute shader biasanya digunakan untuk tugas-tugas seperti simulasi fisika, pembuatan prosedural, atau pemrosesan data.
  5. 'Ray Tracing Shader': Ray tracing shader menggunakan teknologi ray tracing, yang menyimulasikan perilaku cahaya dengan lebih akurat dibandingkan teknik rasterisasi tradisional. Ray tracing shader biasanya digunakan untuk menghasilkan pencahayaan, pantulan, dan bayangan yang sangat realistis dalam aplikasi waktu nyata. Mereka memerlukan perangkat keras yang kuat dan sering digunakan dalam bidang grafis intensif seperti game atau visualisasi arsitektur.
  • Setelah memilih shader, ketik nama apa saja dan tekan Enter

Shader baru telah dibuat dan dapat dibuka di editor skrip apa pun dan dimodifikasi agar sesuai dengan kebutuhan Anda.

Bawaan 'Standard Surface Shader':

Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

Bawaan 'Unlit Shader':

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

Bawaan 'Image Effect Shader':

Shader "Hidden/NewImageEffectShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                // just invert the colors
                col.rgb = 1 - col.rgb;
                return col;
            }
            ENDCG
        }
    }
}

Bawaan 'Compute Shader':

// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain

// Create a RenderTexture with enableRandomWrite flag and set it
// with cs.SetTexture
RWTexture2D<float4> Result;

[numthreads(8,8,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
    // TODO: insert actual code here!

    Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);
}

Bawaan 'Ray Tracing Shader':

RWTexture2D<float4> RenderTarget;

#pragma max_recursion_depth 1

[shader("raygeneration")]
void MyRaygenShader()
{
    uint2 dispatchIdx = DispatchRaysIndex().xy;
   
    RenderTarget[dispatchIdx] = float4(dispatchIdx.x & dispatchIdx.y, (dispatchIdx.x & 15)/15.0, (dispatchIdx.y & 15)/15.0, 0.0);
}

Kesimpulan

Setiap jenis shader memiliki kelebihan dan kegunaannya masing-masing. Penting untuk memilih shader yang sesuai berdasarkan kebutuhan spesifik Anda dan efek visual yang ingin Anda capai dalam proyek Anda.

Artikel yang Disarankan
Membuat Sistem Inventory dan Item Crafting dalam Kesatuan
Membuat GrabPack di Unity Terinspirasi oleh Poppy Playtime
Membuat Efek Bullet Time di Unity
Membuat Game Puzzle di Unity
Membuat Game Terinspirasi Pac-Man di Unity
Cara Memutar File Video di Unity
Membuat Simulator Lalu Lintas di Unity