Menargetkan API grafis dan platform di HLSL
Shader semantics

Mengatur dan menggunakan kata kunci naungan di HLSL

Halaman ini berisi informasi tentang bekerja dengan kata kunci shaderProgram yang berjalan di GPU. More info
Lihat di Glossary
dalam kode HLSL. Untuk pengenalan umum untuk kata kunci naungan, lihat Kata kunci Shader. Untuk informasi tentang menentukan dan menggunakan kata kunci naungan di Shader Graph, lihat.

Halaman ini berisi informasi berikut:

Mengatur kata kunci naungan

Dalam kode HLSL Anda, gunakan petunjuk #pragma untuk menyatakan kata kunci naungan. Anda dapat mendeklarasikan kata kunci naungan dalam naungan grafis biasa (termasuk Permukaan ShaderCara merampingkan naungan menulis untuk Pipeline Render Built-in. More info
Lihat di Glossary
) dan compute shaders.

pragma directives untuk menentukan kata kunci naungan

Untuk mendeklarasikan kata kunci naungan, gunakan salah satu petunjuk 100#pragma berikut dalam kode HLSL:

Directive Description
#pragma dynamic_branch Tentukan set kata kunci untuk digunakan dengan bercabang dinamis.
#pragma multi_compile Tentukan set kata kunci untuk digunakan dengan varian naungan.

Secara default, kata kunci ini memiliki lingkup global dan mempengaruhi semua tahap naungan.

Proses build mencakup semua kata kunci dari set ini.
#pragma shader_feature Tentukan set kata kunci untuk digunakan dengan varian naungan, dan juga memerintahkan kompilator untuk menyusun varian di mana tidak ada kata kunci ini diaktifkan.

Secara default, kata kunci ini memiliki lingkup global dan mempengaruhi semua tahap naungan.

Proses build termasuk kata kunci dari set ini yang digunakan pada waktu build.

Untuk informasi lebih lanjut tentang perbedaan antara opsi ini, dan panduan pada saat menggunakan yang satu, lihat Kata kunci Shader.

Sitemap Jika Anda menambahkan naungan ke daftar Note: di jendela pengaturan Grafik, Unity mencakup semua kata kunci dari semua set dalam build, bahkan jika mereka dinyatakan dengan Always Included Shaders.#pragma shader_feature.

Anda juga dapat menambahkan suffixes ke petunjuk ini untuk mengubah perilaku mereka:

  • Tambahkan _local untuk menunjukkan bahwa satu set kata kunci memiliki lingkup lokal dan tidak dapat ditimidasi oleh kata kunci global; jika tidak, kata kunci memiliki lingkup global dan dapat ditimidasi oleh kata kunci global.

    Anda dapat menambahkan suffix ini ke #pragma dynamic_branch, #pragma multi_compile, atau directives #pragma shader_feature; misalnya, #pragma dynamic_branch_local, #pragma multi_compile_local, atau #pragma shader_feature_local.
  • Tambahkan _vertex, _fragment, _hull, _domain, _geometry, atau _raytracing untuk menunjukkan bahwa satu set kata kunci hanya mempengaruhi tahap naungan yang diberikan, yang dapat mengurangi jumlah varian naungan yang tidak diinginkan. Untuk informasi lebih lanjut, lihat Kata kunci Shader: Kata kunci spesifik tahap.

    Anda dapat menambahkan suffixes ini ke directives #pragma multi_compile atau #pragma shader_feature, baik standalone atau setelah pengubah _local; misalnya, #pragma multi_compile_vertex atau #pragma shader_feature_local_fragment. Ini tidak bekerja dengan #pragma dynamic_branch.

Selain itu, ada beberapa variasi "pendek" dari #pragma multi_compile yang menambahkan set kata kunci yang telah ditentukan. Untuk informasi lebih lanjut tentang ini, lihat multi_compile shortcuts.

Mengatur satu set kata kunci

Anda menyatakan kata kunci dalam set. Satu set berisi kata kunci eksklusif bersama.

Untuk menyatakan satu set kata kunci, gunakan langsungif #pragma yang tepat, diikuti oleh daftar kata kunci yang didelimited ruang.

Contoh ini menunjukkan bagaimana untuk menyatakan satu set empat kata kunci:

#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA

Apa yang terjadi secara internal tergantung pada apakah Anda menyatakan kata kunci ini untuk digunakan dengan varian warna atau dengan percabangan dinamis.

Ketika Anda menggunakan #pragma multi_compile atau #pragma shader_feature untuk menggunakan kata kunci dengan varian naungan, Unity menggunakan kata kunci untuk membuat directives #define. Dalam contoh di atas, ketika Unity menyusun naungan, itu menghasilkan empat varian: satu di mana KUALITAS_ LOW didefinisikan, satu di mana KUALITAS_ MEDIUM didefinisikan, satu di mana KUALITAS_HIGH didefinisikan, dan satu di mana KUALITAS_ULTRA didefinisikan.

Ketika Anda menggunakan #pragma dynamic_branch untuk menggunakan kata kunci dengan percabangan dinamis, Unity menggunakan kata kunci untuk membuat variabel seragam. Jika contoh di atas digunakan #pragma dynamic_branch, ketika Unity mengkompilasi naungan, itu akan menciptakan empat variabel seragam dengan keadaan boolean: satu yang disebut KUALITAS_LOW, satu yang disebut KUALITAS_MEDIUM, dan sebagainya.

Mengatur beberapa set kata kunci

Anda dapat menyatakan beberapa set kata kunci untuk mewakili fitur yang berbeda. Untuk melakukan ini, gunakan beberapa arahan #pragma.

Contoh ini menunjukkan bagaimana untuk menyatakan satu set empat kata kunci, dan satu set dari tiga kata kunci:

#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA
#pragma multi_compile COLOR_RED COLOR_GREEN COLOR_BLUE

Membuat varian di mana tidak ada kata kunci didefinisikan

Ketika Anda menggunakan #pragma shader_feature untuk menyatakan satu set kata kunci, Unity juga menyusun varian di mana tidak ada kata kunci yang ditetapkan. Ini memungkinkan Anda untuk menentukan perilaku tanpa menggunakan kata kunci tambahan. Mengurangi jumlah kata kunci bermanfaat dalam beberapa cara: itu dapat mengurangi jumlah total varian yang disatukan, yang meningkatkan kedua kali build dan kinerja runtime; itu mengurangi jumlah total kata kunci yang digunakan naungan, yang mencegahnya dari memukul shader keyword limits; dan itu membuatnya lebih sederhana untuk mengelola state kata kunci dari skrip C#, karena ada kata kunci yang lebih sedikit untuk mengaktifkan dan menonaktifkan.

Contoh ini menunjukkan bagaimana untuk menyatakan satu set yang hanya berisi kata kunci tunggal:

#pragma shader_feature EXAMPLE_ON

Anda juga dapat menginstruksikan Unity untuk melakukan ini ketika Anda menggunakan #pragma multi_compile. Untuk melakukannya, tambahkan kata kunci “blank” ke set, dengan nama yang satu atau lebih core (_), seperti ini:

#pragma multi_compile __ EXAMPLE_ON

Limitations

Ada beberapa batasan untuk bagaimana Anda menyatakan set kata kunci:

  • Jika Anda menyatakan kata kunci yang sama untuk digunakan dengan bercabang dinamis dan varian naungan, Unity memprioritaskan percabangan dinamis dan kata kunci naungan tidak akan bekerja dengan varian.
  • Anda tidak dapat menyertakan kata kunci yang sama lebih dari sekali dalam set yang sama; Namun, Anda dapat menyatakan kata kunci yang sama dalam set yang berbeda.
  • Anda tidak dapat menyatakan set kata kunci yang sama lebih dari sekali dalam program naungan.
  • Ada batasan jumlah kata kunci yang dapat digunakan oleh naungan. Setiap kata kunci dinyatakan dalam file sumber naungan dan jumlah dependensinya terhadap batas ini. Untuk informasi lebih lanjut, lihat Batas kata kunci Shader.

Membuat kondisi perilaku dengan kata kunci naungan

Untuk menandai bagian kode naungan Anda sebagai kondisional berdasarkan apakah kata kunci naungan yang diberikan diaktifkan atau dinonaktifkan, gunakan an HLSL if statement.

Ini bekerja untuk kedua kata kunci varian dan kata kunci bercabang dinamis, dan berarti bahwa Anda dapat menggunakan sintaks yang sama untuk keduanya. Ini memudahkan untuk menjaga kode Anda, dan juga mudah untuk mengubah cara yang Anda gunakan kata kunci jika diperlukan. Misalnya, jika Anda menemukan bahwa Anda perlu mengurangi jumlah varian dalam aplikasi Anda, Anda dapat mengubah set kata kunci untuk menggunakan cabang dinamis hanya dengan mengubah deklarasi; Anda tidak perlu juga mengubah kondisi.

// Declare a set of keywords
#pragma multi_compile QUALITY_LOW QUALITY_MEDIUM QUALITY_HIGH QUALITY_ULTRA


if (QUALITY_ULTRA)
{
// If the keywords work with shader variants, the shader compiler recognises this code as a static branch and compiles it only for the needed variants
// If the keywords work with dynamic branching, the shader compiler compiles this code as a regular dynamic branch
}

Ini bekerja karena kompilator naungan Unity mewakili kata kunci varian naungan dinonaktifkan sebagai variabel konstan dengan nilai 0.

Catatan: Anda juga dapat menggunakan [#if, #elif, #else, dan #endif preprocessor langsung](https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-if), dan [#ifdef dan #ifndef preprocessor directives](https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-ifdef) dengan kata kunci yang menggunakan varian naungan; namun, jika Anda melakukan ini, akan lebih sulit untuk mengkonversi kode Anda untuk bekerja dengan cabang dinamis di masa depan.

Selain itu, arahan #pragma require dan #pragma target dapat mengambil kata kunci sebagai parameter, sehingga mereka hanya berlaku untuk varian di mana kata kunci yang diberikan diaktifkan. Untuk informasi lebih lanjut, lihat Menargetkan model naungan dan fitur GPU di HLSL.

multi_compile shortcuts

Unity menyediakan beberapa notasi "pendek" untuk menentukan kata kunci naungan yang menghasilkan varian naungan tertentu.

Potongan-potongan berikut berkaitan dengan cahaya, bayangan dan ringan dalam Render PipelineRangkaian operasi yang mengambil isi dari Adegan, dan menampilkannya di layar. Unity memungkinkan Anda memilih dari pipa render yang dibangun sebelumnya, atau menulis sendiri. More info
Lihat di Glossary
Built-in:

  • multi_compile_fwdbase menambahkan set kata kunci ini: LIGHTMAP_ON DIRLIGHTMAP_COM Login Login Login LIGHTMAP_SHADOW_MIXING LIGHTPROBE_SH. Varietas ini diperlukan oleh PassType.ForwardBase.
  • multi_compile_fwdbasealpha menambahkan set kata kunci ini: LIGHTMAP_ON DIRLIGHTMAP_COM LIGHTMAP_SHADOW_MIXING Login LIGHTPROBE_SH. Varietas ini diperlukan oleh PassType.ForwardBase.
  • multi_compile_fwdadd menambahkan set kata kunci ini: POINT DIRECTIONAL SPOT POINT_COOKIE LANGSUNG_COOKIE. Varietas ini diperlukan oleh PassType.ForwardAdd.
  • multi_compile_fwdadd_fullshadows menambahkan set kata kunci ini: POINT DIRECTIONAL SPOT POINT_COOKIE LANGSUNG_COOKIE Login Login Login Login Login LIGHTMAP_SHADOW_MIXING. Ini sama dengan multi_compile_fwdadd, tetapi ini menambahkan kemampuan untuk lampu untuk memiliki bayangan real-time.
  • multi_compile_lightpass menambahkan set kata kunci ini: POINT DIRECTIONAL SPOT POINT_COOKIE LANGSUNG_COOKIE Login Login Login Login Login LIGHTMAP_SHADOW_MIXING. Ini adalah cara pintas yang efektif untuk semua fungsi yang terkait dengan cahaya dan bayangan real-time, selain Light Probesprobe cahaya menyimpan informasi tentang bagaimana cahaya melewati ruang di tempat kejadian Anda. Koleksi probe cahaya yang diatur dalam ruang tertentu dapat meningkatkan pencahayaan pada objek bergerak dan pemandangan LOD statis dalam ruang itu. More info
    Lihat di Glossary
    .
  • multi_compile_shadowcaster menambahkan set kata kunci ini: SHADOWS_DEPTH SHADOWS_CUBE. Varietas ini diperlukan oleh PassType.ShadowCaster.
  • multi_compile_shadowcollector menambahkan set kata kunci ini: SHADOWS_SPLIT_SPHERES SHADOWS_SINGLE_CASCADE. Ini juga menyusun varian tanpa salah satu kata kunci ini. Varietas ini diperlukan untuk bayangan ruang layar.
  • multi_compile_prepassfinal menambahkan set kata kunci ini: LIGHTMAP_ON DIRLIGHTMAP_COMBINED Login UNITY_HDR_ON Login LIGHTPROBE_SH. Ini juga menyusun varian tanpa salah satu kata kunci ini. Varietas ini diperlukan oleh PassType.LightPrePassFinal dan PassType.Deferred.

Potongan-potongan berikut berkaitan dengan pengaturan lain:

  • multi_compile_particles menambahkan kata kunci ini berkaitan dengan built-in particle systemKomponen yang mensimulasikan entitas fluida seperti cairan, awan dan nyala dengan menghasilkan dan memikat sejumlah besar gambar 2D kecil di tempat kejadian. More info
    Lihat di Glossary
    : Login Ini juga menyusun varian tanpa kata kunci ini. Untuk informasi lebih lanjut, lihat Sistem Partikel Built-in.
  • multi_compile_fog menambahkan set kata kunci ini yang berkaitan dengan fog: FOG_LINEAR, FOG_EXP, FOG_EXP2. Ini juga menyusun varian tanpa salah satu kata kunci ini. Anda dapat mengontrol perilaku ini di jendela Pengaturan grafis.
  • multi_compile_instancing menambahkan kata kunci yang berkaitan dengan hukuman. Jika naungan menggunakan sikap prosedural, itu menambahkan set kata kunci ini: INSTANCING_ON PROCEDURAL_ON. Jika tidak, itu menambahkan kata kunci ini: Login Ini juga menyusun varian tanpa salah satu kata kunci ini. Anda dapat mengontrol perilaku ini di jendela Pengaturan grafis.

Sebagian besar pintas ini mengandung beberapa kata kunci. jika Anda tahu proyek tidak perlu mereka, Anda dapat menggunakan #pragma skip_variants untuk menghapus beberapa dari mereka. Contoh:

#pragma multi_compile_fwdadd
#pragma skip_variants POINT POINT_COOKIE

Ini memberi tahu kompilator untuk menghapus kata kunci POINT atau POINT_COOKIE dari arahan lainnya.

Menargetkan API grafis dan platform di HLSL
Shader semantics