Kata kunci Shader
Menggunakan kata kunci naungan dengan bahan Inspektur

Menggunakan kata kunci naungan dengan skrip C#

Anda dapat mengaktifkan atau menonaktifkan kata kunci shaderProgram yang berjalan di GPU. More info
Lihat di Glossary
. Ketika Anda mengaktifkan atau menonaktifkan kata kunci naungan, naungan menampilkan perilaku kondisional yang sesuai. Tergantung pada apakah kata kunci bekerja dengan varian naungan atau percabangan dinamis, ini berarti bahwa kedua Unity membuat varian naungan yang tepat, atau GPU mengeksekusi cabang yang tepat.

Halaman ini berisi informasi berikut:

Kata kunci naungan lokal dan global

Ketika Unity mewakili kata kunci naungan di C #, itu menggunakan konsep local shader keywords dan global shader keywords.

Kata kunci warna lokal terdiri dari semua kata kunci yang Anda deklarasikan dalam file sumber naungan. Kata kunci naungan lokal mempengaruhi naungan individu atau kolon. Kata kunci lokal dapat memiliki ruang lingkup lokal atau global, yang mempengaruhi apakah mereka dapat ditimidasi oleh kata kunci naungan global.

Kata kunci naungan global bertindak sebagai overrides untuk kata kunci naungan lokal. Anda tidak menyatakan ini dalam file sumber naungan; mereka hanya ada dalam kode C#. Kata kunci naungan global dapat mempengaruhi beberapa naungan dan merutekan naungan pada saat yang sama.

Kata kunci warna lokal

Ketika Anda mendeklarasikan kata kunci naungan dalam file sumber naungan, Unity mewakili ini di C # dengan struct LocalKeyword. Ini disebut local shader keyword.

Properti isOverridable dari LocalKeyword menunjukkan apakah kata kunci diumumkan dengan lingkup global atau lokal dalam file sumber. Ini adalah true jika kata kunci dideklarasikan dengan lingkup global dan karena itu dapat ditimidasi oleh kata kunci naungan global dengan nama yang sama. Ini adalah false jika kata kunci diumumkan dengan lingkup lokal, dan karena itu tidak dapat ditimidasi oleh kata kunci naungan global dengan nama yang sama.

Unity menyimpan semua kata kunci naungan lokal yang mempengaruhi naungan atau kolon dalam struct LocalKeywordSpace. Untuk naungan grafis, Anda dapat mengakses ini dengan Shader.keywordSpace. Untuk naungan compute, Anda dapat mengakses ini dengan ComputeShader-keywordSpace.

Kata kunci naungan global

Selain kata kunci naungan lokal yang Anda deklarasikan dalam file sumber Anda, Unity mempertahankan daftar terpisah dari global shader keywords. Anda tidak menyatakan ini dalam file sumber naungan; bukan, mereka runtime overrides untuk kata kunci naungan lokal yang Anda kerjakan di C #. Kata kunci naungan global dapat mempengaruhi beberapa naungan dan membandingkan naungan pada saat yang sama.

Unity mewakili kata kunci naungan global dengan struct GlobalKeyword.

Menyiapkan kata kunci naungan global dapat nyaman ketika Anda perlu mengaktifkan atau menonaktifkan kata kunci naungan yang sama untuk banyak bahan dan pewarna. Namun, ia memiliki kelemahan potensial berikut:

  • Menyiapkan keadaan global kata kunci dapat menyebabkan konsekuensi yang tidak diinginkan jika naungan secara tidak sengaja mendefinisikan kata kunci dengan nama yang sama. Anda dapat menjaga terhadap ini dengan menentukan kata kunci dengan lingkup lokal, atau dengan naming kata kunci dengan cara yang mengurangi kemungkinan kerang.
  • Ketika Anda membuat GlobalKeyword baru, Unity memperbarui pemetaan internal antara ruang kata kunci global dan lokal untuk semua naungan dan pewarna compute dimuat pada titik ini. Ini dapat menjadi operasi intensif CPU. Untuk mengurangi dampak operasi ini, cobalah untuk membuat semua kata kunci global segera setelah startup aplikasi, sementara aplikasi Anda memuat.

Bagaimana kata kunci naungan lokal dan global berinteraksi

Ketika kata kunci naungan global dan lokal dengan nama yang sama memiliki keadaan yang berbeda, Unity menggunakan properti isOverridable dari LocalKeyword untuk menentukan apakah kata kunci diaktifkan atau dinonaktifkan untuk bahan individu atau membandingkan naungan. isOverridable benar jika kata kunci dinyatakan dengan lingkup global, dan false jika diumumkan dengan lingkup lokal.

  • Saat isOverridable adalah true: Jika kata kunci global dengan nama yang sama ada dan diaktifkan, Unity menggunakan keadaan kata kunci global. Jika tidak, Unity menggunakan keadaan kata kunci lokal.
  • Saat isOverridable adalah false: Unity selalu menggunakan keadaan kata kunci lokal.

Oleh karena itu, untuk memahami apakah kata kunci naungan diaktifkan atau dinonaktifkan untuk bahan individu atau pewarnaan, Anda harus memeriksa keadaan properti isOverridable dan negara kata kunci global dan/atau lokal.

Contoh ini menunjukkan bagaimana untuk memeriksa apakah Unity menganggap kata kunci diaktifkan atau dinonaktifkan untuk bahan:

using UnityEngine;
using UnityEngine.Rendering;

public class KeywordExample : MonoBehaviour
{
    public Material material;

    void Start()
    {
        CheckShaderKeywordState();
    }

    void CheckShaderKeywordState()
    {
        // Get the instance of the Shader class that the material uses
        var shader = material.shader;

        // Get all the local keywords that affect the Shader
        var keywordSpace = shader.keywordSpace;

        // Iterate over the local keywords
        foreach (var localKeyword in keywordSpace.keywords)
        {
            // If the local keyword is overridable (i.e., it was declared with a global scope),
            // and a global keyword with the same name exists and is enabled,
            // then Unity uses the global keyword state
            if (localKeyword.isOverridable && Shader.IsKeywordEnabled(localKeyword.name))
            {
                Debug.Log("Local keyword with name of " + localKeyword.name + " is overridden by a global keyword, and is enabled");
            }
            // Otherwise, Unity uses the local keyword state
            else
            {
                var state = material.IsKeywordEnabled(localKeyword) ? "enabled" : "disabled";
                Debug.Log("Local keyword with name of " + localKeyword.name + " is " + state);
            }            
        }
    }
}

varian Shader atau percabangan dinamis

Dalam Unity, Anda dapat menggunakan kata kunci naungan dengan varian naungan, atau Anda dapat menggunakannya dengan percabangan dinamis. Anda memutuskan ketika Anda menyatakan kata kunci.

Properti isDynamic dari LocalKeyword menunjukkan apakah kata kunci diumumkan untuk digunakan dengan percabangan dinamis dalam file sumber naungan. Ini adalah true jika kata kunci dinyatakan untuk digunakan dengan percabangan dinamis, dan false jika dideklarasikan untuk digunakan dengan varian naungan.

Mengaktifkan dan menonaktifkan kata kunci naungan

Untuk memeriksa apakah kata kunci lokal diaktifkan untuk naungan grafis, gunakan Bahan.IsKeywordEnabled atau Bahan.enabledKeywords. Untuk naungan compute, gunakan ComputeShader.IsKeywordEnabled, atau [ComputeShader.enabledKeywords].

Untuk memeriksa apakah kata kunci global diaktifkan, gunakan Shader.IsKeywordEnabled atau Shader.enabledGlobalKeywords atau ComputeShader.enabledKeywords.

Untuk mengaktifkan atau menonaktifkan kata kunci naungan lokal untuk naungan grafis, gunakan Bahan.SetKeyword, Bahan.EnableKeyword, atau Bahan.TabelKeyword. Untuk naungan compute, gunakan ComputeShader.SetKeyword, ComputeShader.EnableKeyword, atau ComputeShader.DisableKeyword.

Untuk mengaktifkan atau menonaktifkan kata kunci naungan global, gunakan Shader.SetKeyword, ComputeShader.EnableKeyword, atau ComputeShader.DisableKeyword.

Untuk mengaktifkan atau menonaktifkan kata kunci lokal atau global dengan Command Buffer, gunakan CommandBuffer.EnableKeyword, atau CommandBuffer.DisableKeyword.

Sitemap Ketika Anda mengaktifkan atau menonaktifkan kata kunci yang bekerja dengan varian warna, Unity menggunakan varian warna yang berbeda. Mengubah varian warna pada runtime dapat mempengaruhi kinerja. Jika perubahan kata kunci membutuhkan varian untuk digunakan untuk pertama kalinya, itu dapat menyebabkan memukul sementara driver grafis menyiapkan program naungan. Ini bisa menjadi masalah tertentu bagi naungan besar atau kompleks, atau jika perubahan state kata kunci global mempengaruhi beberapa naungan. Untuk menghindari ini, jika Anda menggunakan kata kunci dengan varian naungan, pastikan Anda mempertimbangkan varian kata kunci dalam pemuatan naungan dan strategi prewarming Anda. Untuk informasi lebih lanjut, lihat Note:.Shader loading.

Mengelola set kata kunci pada runtime

Ketika Anda memberikan naungan Anda, Anda menyatakan kata kunci dalam set. Satu set mengandung kata kunci yang saling eksklusif.

Pada runtime, Unity tidak memiliki konsep set ini. Ini memungkinkan Anda untuk mengaktifkan atau menonaktifkan kata kunci mana pun secara independen, dan mengaktifkan atau menonaktifkan kata kunci tidak berpengaruh pada keadaan kata kunci lain. Ini berarti bahwa dimungkinkan untuk mengaktifkan beberapa kata kunci dari set yang sama, atau menonaktifkan semua kata kunci dalam satu set.

Jika Anda menggunakan kata kunci dengan varian naungan, ketika lebih dari satu kata kunci dalam satu set diaktifkan atau tidak ada kata kunci dalam satu set diaktifkan, Unity memilih varian yang mempertimbangkan "baik yang baik" pertandingan. Tidak ada jaminan tentang apa yang sebenarnya terjadi, dan dapat menyebabkan hasil yang tidak diinginkan. Cara terbaik untuk menghindari situasi ini dengan mengelola keadaan kata kunci dengan hati-hati.

Jika Anda menggunakan kata kunci dengan percabangan dinamis, ketika lebih dari satu kata kunci dalam satu set diaktifkan atau tidak ada kata kunci dalam satu set diaktifkan, cabang bersyarat dijalankan sesuai. Sebagai contoh, jika kedua KEYWORD_A dan KEYWORD_B diaktifkan, cabang untuk if (KEYWORD_A) dan if (KEYWORD_B) akan mengeksekusi.

Kata kunci Shader
Menggunakan kata kunci naungan dengan bahan Inspektur