Tworzenie niestandardowego shadera terenu w Unity

W tym samouczku utworzymy niestandardowy shader terenu w Unity, aby nadać Twojemu terenowi bardziej realistyczne tekstury i oświetlenie. Takie podejście pozwala na lepszą wydajność i kontrolę nad interakcją terenu ze światłami, cieniami i innymi efektami środowiskowymi. Omówimy konfigurację shadera, używanie go z systemem terenu Unity i wprowadzanie zmian w celu uzyskania optymalnej wydajności.

1. Konfigurowanie terenu

Zanim przejdziemy do tworzenia shaderów, najpierw skonfigurujmy teren w Unity:

  1. W Unity przejdź do menu GameObject i wybierz 3D Object > Terrain.
  2. Spowoduje to dodanie nowego obiektu Terrain do Twojej sceny. Możesz dostosować jego rozmiar, wysokość i inne ustawienia w Terrain Inspector.
  3. Po utworzeniu terenu możesz malować na nim za pomocą narzędzia Paint Texture w Inspektorze. Ale na razie zostaw to pole puste, ponieważ zastosujemy niestandardowy shader.

2. Tworzenie shadera terenu

Teraz utwórzmy niestandardowy shader terenu. Wykonaj następujące kroki:

  1. Kliknij prawym przyciskiem myszy w oknie Projekt i wybierz Utwórz > Shader > Standardowy shader powierzchni.
  2. Nadaj shaderowi nazwę CustomTerrainShader i otwórz go w preferowanym edytorze kodu.

Zastąp domyślny kod shadera następującym:

Shader "Custom/TerrainShader"
{
    Properties
    {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _BumpMap ("Normal Map", 2D) = "bump" {}
        _Specular ("Specular", Color) = (0.2, 0.2, 0.2, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Specular;

        struct Input
        {
            float2 uv_MainTex;
            float3 worldNormal;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex));
            o.Specular = _Specular;
            o.Smoothness = 0.5;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

3. Stosowanie Shadera do terenu

Po utworzeniu shadera należy zastosować go do materiału terenu:

  • Kliknij prawym przyciskiem myszy w oknie projektu i wybierz Utwórz > Materiał. Nadaj temu materiałowi nazwę MateriałTerrainMaterial.
  • W Inspektorze materiałów kliknij menu rozwijane Shader i wybierz opcję Custom > TerrainShader.
  • Przypisz tekstury dla MainTex i BumpMap w Inspektorze materiałów.
  • Teraz przypisz ten materiał do swojego terenu, wybierając obiekt Teren, przechodząc do Inspektora terenu i ustawiając Materiał terenu w sekcji Materiały.

4. Dostrajanie Shadera w celu zwiększenia wydajności

Aby zapewnić płynne działanie shadera, zwłaszcza na dużych obszarach, możemy zmienić kilka ustawień:

  • Obniż rozdzielczość mapy normalnej lub użyj uproszczonej, aby zmniejszyć obciążenie procesora graficznego.
  • Wyłącz wszystkie funkcje shadera, których nie używasz (np. mapowanie paralaksy lub dodatkowe efekty świetlne).
  • Użyj wbudowanego w Unity systemu Terrain LOD, aby dynamicznie dostosowywać poziom szczegółowości odległych części terenu.

5. Ostateczne regulacje i testy

Po zastosowaniu shadera i skonfigurowaniu terenu przetestuj go w różnych warunkach oświetleniowych. Możesz dostosować właściwości Specular i Smoothness shadera, aby zobaczyć, jak wpływają one na ogólny wygląd terenu w różnych środowiskach.

Wniosek

Dzięki niestandardowemu shaderowi terenu możesz zwiększyć wierność wizualną swoich terenów, zachowując jednocześnie kontrolę nad wydajnością. Możesz swobodnie rozbudowywać ten shader, dodając dodatkowe funkcje, takie jak tekstury szczegółów, mapowanie trójpłaszczyznowe lub teselacja.