Unity Gölgelendirici Nasıl Oluşturulur

Shader, aydınlatma girdisine ve Malzeme konfigürasyonuna bağlı olarak oluşturulan her pikselin rengini hesaplamak için matematiksel hesaplamalar ve algoritmalar içeren küçük bir komut dosyasıdır.

Unity Aşağıdaki dillerde yazılan Gölgelendiriciler'i kullanır:

  • Gölgelendirici programlarının kendilerinin yazılması için HLSL adı verilen bir programlama dili kullanılır.
  • ShaderLab adı verilen Unity'e özgü bir dil, gölgelendirici programları için kapsayıcı görevi gören bir Shader nesnesini tanımlamak için kullanılır.

Unity'te gölgelendirici oluşturmak için aşağıdaki adımları izleyin:

Gölgelendirici Oluştur

  • Proje görünümüne sağ tıklayın -> 'Create' -> 'Shader'

Kullandığınız Unity sürümüne bağlı olarak Gölgelendirici seçenekleri farklılık gösterebilir ancak seçeneklerin her birinin anlamı şu şekildedir:

  1. 'Standard Surface Shader': Bu gölgelendirici Unity's Fiziksel Tabanlı İşleme (PBR) sistemiyle çalışacak şekilde tasarlanmıştır. Geliştiricilerin aydınlatma koşullarına gerçekçi bir şekilde yanıt veren malzemeler oluşturmasına olanak tanır. Normal haritalama, aynasal vurgular ve yansımalar gibi çeşitli oluşturma özelliklerini destekler. Gerçekçilik ile performans arasında iyi bir denge sağlayan çok yönlü bir gölgelendiricidir.
  2. 'Unlit Shader': Adından da anlaşılacağı gibi, aydınlatılmamış gölgelendirici aydınlatma koşullarını dikkate almaz. Genellikle kullanıcı arayüzü öğeleri, parçacık sistemleri veya özel efektler gibi gerçekçi ışıklandırmaya ihtiyaç duymayan efektlerin oluşturulması için kullanılır. Işıklandırılmamış gölgelendiriciler genellikle daha verimlidir ve herhangi bir aydınlatma hesaplaması olmadan bir nesnenin görünümü üzerinde tam kontrol gerektirdiği durumlarda yararlı olabilir.
  3. 'Image Effect Shader': görüntü efekti gölgelendiriciler, ekranın tamamına veya belirli oluşturma hedeflerine işleme sonrası efektleri uygulamak için kullanılır. Ana işleme tamamlandıktan sonra geliştiricilerin son oluşturulan görüntüyü değiştirmesine olanak tanır. Görüntü efektlerine örnek olarak bulanıklaştırma, renk derecelendirme, bozulma veya stilize edilmiş filtreler verilebilir. Görsel kaliteyi arttırmak veya belirli sanatsal efektler yaratmak için kullanılabilirler.
  4. 'Compute Shader': Hesaplama gölgelendiricisi, GPU üzerinde çalışan ancak doğrudan pikseller üzerinde çalışmayan bir gölgelendirici türüdür. Paralel veriler üzerinde genel amaçlı hesaplamalar için kullanılır ve geliştiricilerin karmaşık hesaplamaları veya simülasyonları verimli bir şekilde gerçekleştirmesine olanak tanır. Hesaplama gölgelendiricileri genellikle fizik simülasyonları, prosedür oluşturma veya veri işleme gibi görevler için kullanılır.
  5. 'Ray Tracing Shader': Işın izleme gölgelendiricileri, geleneksel rasterleştirme teknikleriyle karşılaştırıldığında ışığın davranışını daha doğru şekilde simüle eden ışın izleme teknolojisini kullanır. Işın izleme gölgelendiricileri genellikle gerçek zamanlı uygulamalarda son derece gerçekçi aydınlatma, yansımalar ve gölgeler elde etmek için kullanılır. Güçlü donanım gerektirirler ve genellikle oyun veya mimari görselleştirme gibi grafik ağırlıklı alanlarda kullanılırlar.
  • Gölgelendiriciyi seçtikten sonra herhangi bir ad yazın ve Enter tuşuna basın

Yeni Shader herhangi bir komut dosyası düzenleyicisinde oluşturulur ve açılabilir ve ihtiyaçlarınıza uyacak şekilde değiştirilebilir.

Varsayılan '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"
}

Varsayılan '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
        }
    }
}

Varsayılan '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
        }
    }
}

Varsayılan '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);
}

Varsayılan '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);
}

Çözüm

Her gölgelendirici türünün kendine has güçlü yönleri ve kullanım alanları vardır. Özel gereksinimlerinize ve projenizde elde etmeyi hedeflediğiniz görsel efektlere göre uygun gölgelendiriciyi seçmeniz önemlidir.

Önerilen Makaleler
Unity'de Video Dosyaları Nasıl Oynatılır
Unity'de Keskin Nişancı Kapsamı Etkisi Nasıl Eklenir?
Unity'de Ara Sahne Nasıl Tetiklenir?
Unity'de Nasıl Daha İyi Bir Programcı Olunur?
Unity'de Zamanlayıcıları Uygulamak
Unity'de Bir Nesnenin Fare İmlecini Takip Etmesi Nasıl Yapılır
Poppy Playtime'dan Esinlenerek Unity'de GrabPack Oluşturma