Kondisi dalam naungan
Varietas Shader

Cabang di naungan

Cabang adalah salah satu cara memperkenalkan perilaku kondisional menjadi kode shaderProgram yang berjalan di GPU. More info
Lihat di Glossary
.

Halaman ini berisi informasi tentang teknik berikut:

Untuk gambaran umum dari kondisional dalam kode naungan dan ketika menggunakan teknik mana, lihat Kondisi dalam kode naungan.

Cabang statis

Ketika program naungan mencakup kondisional yang dievaluasi pada waktu kompilasi, itu menggunakan cabang statis. Kompiler tidak termasuk kode dari cabang yang tidak digunakan, sehingga tidak muncul dalam program naungan yang disusun.

Secara internal, Unity menggunakan percabangan statis ketika menciptakan varian naungan; Namun, percabangan statis sendiri tidak memiliki kelemahan kinerja dari varian naungan.

Keuntungan dan kerugian dari percabangan statis

Keuntungan utama dari percabangan statis adalah bahwa tidak memiliki dampak negatif pada kinerja runtime. Kerugian utama percabangan statis adalah bahwa Anda hanya dapat menggunakannya pada waktu kompilasi.

Percabangan statis berarti bahwa kompiler tidak ada kode yang tidak diinginkan dari program naungan. Ini menghasilkan program naungan kecil, khusus yang hanya mengandung kode yang diperlukan. Tidak ada biaya kinerja runtime ke percabangan statis; pada kenyataannya, program yang lebih kecil cenderung menghasilkan waktu beban yang lebih cepat dan penggunaan memori runtime yang lebih rendah.

Untuk menggunakan percabangan statis, kondisi harus konstan pada waktu kompilasi. Ini berarti bahwa Anda tidak dapat menggunakannya untuk mengeksekusi kode untuk kondisi yang berbeda pada runtime.

Cara menggunakan percabangan statis

Anda dapat menggunakan percabangan statis dalam naungan Anda dengan cara-cara berikut:

  • Dalam naungan berkode tangan:
    • Gunakan [#if, #elif, #else, dan #endif] (https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-pre-if) preprocessor directives, atau [#ifdef dan #ifndef](https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hls-appendix-pre-ifdef) preprocessor directives untuk membuat cabang statis.
    • Gunakan if statement yang mengevaluasi nilai konstan waktu kompilasi. Meskipun pernyataan if juga dapat digunakan untuk cabang dinamis, kompiler mendeteksi nilai konstan waktu kompilasi dan menciptakan cabang statis sebagai gantinya.
    • Unity menyediakan makro built-in untuk beberapa konstanta waktu kompilasi yang dapat Anda gunakan dengan cabang statis.

Sitemap Cabang statis hanya tersedia di naungan yang dikodekan tangan. Anda tidak dapat membuat cabang statis di Shader Graph.Note: Static branching is available only in hand-coded shaders. You cannot create static branches in Shader Graph.

Cabang dinamis

Ketika program naungan mencakup kondisional yang dievaluasi pada runtime, itu menggunakan percabangan dinamis.

Ada dua jenis percabangan dinamis: percabangan dinamis berdasarkan variabel seragam, dan percabangan dinamis berdasarkan nilai runtime lainnya. Percabangan berbasis seragam biasanya lebih efisien, karena nilai seragam konstan untuk seluruh panggilan menggambar.

Anda dapat menggunakan kata kunci warna untuk percabangan dinamis. Ini memungkinkan Anda untuk menggunakan C # scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary
dan Bahan InspectorJendela Unity yang menampilkan informasi tentang Pengaturan GameObject yang dipilih saat ini, aset atau proyek, memungkinkan Anda untuk memeriksa dan mengedit nilai. More info
Lihat di Glossary
untuk mengkonfigurasi perilaku percabangan runtime untuk naungan Anda. Hasil ini adalah percabangan berbasis seragam; ketika Anda melakukan ini, Unity menyusun kata kunci naungan sebagai seragam.

Keuntungan dan kerugian dari percabangan dinamis

Keuntungan utama dari percabangan dinamis adalah bahwa memungkinkan Anda untuk menggunakan kondisi pada runtime tanpa meningkatkan jumlah varian naungan dalam proyek Anda. Kerugian utama dari percabangan dinamis adalah bahwa dampak kinerja GPU.

Dampak kinerja GPU bervariasi oleh perangkat keras, dan dengan kode naungan. Alasannya adalah:

  • Branching berdasarkan variabel non-uniform berarti bahwa GPU harus melakukan operasi yang berbeda pada saat yang sama (dan oleh karena itu melanggar paralelisme), atau “membangun cabang” dan menjaga paralelisme dengan melakukan operasi untuk kedua cabang dan kemudian membuang satu hasil. Cabang berdasarkan variabel seragam berarti bahwa GPU harus meratakan cabang. Kedua pendekatan ini menghasilkan kinerja GPU yang berkurang.
  • Untuk setiap jenis percabangan dinamis, GPU harus mengalokasikan ruang register untuk kasus terburuk. Jika satu cabang jauh lebih mahal daripada yang lain, ini berarti bahwa ruang register limbah GPU. Ini dapat menyebabkan panggilan lebih sedikit dari program naungan sejajar, yang mengurangi kinerja.

Secara umum, jika cabang kode Anda pada nilai-nilai seragam dan kedua cabang memiliki beban kerja yang mirip secara kira-kira, maka dampak pada kinerja GPU cenderung kecil. Namun, Anda harus selalu memberi profil aplikasi Anda dan mempertimbangkan kelebihan dan kekurangan kasus.

Percabangan dinamis Note: juga dapat menyebabkan program naungan yang besar, karena kode untuk semua kondisi disusun ke dalam program naungan yang sama. Namun, efek dari file yang lebih besar ini pada waktu beban dan penggunaan memori biasanya kurang signifikan dari dampak varian naungan.

Untuk informasi tentang cara lain menggunakan kondisional dalam naungan, dan bagaimana memutuskan teknik mana yang tepat untuk kasus penggunaan Anda, lihat Kondisi dalam naungan.

Bagaimana cara menggunakan percabangan dinamis

Anda dapat menggunakan percabangan dinamis dengan cara berikut:

  • Dalam naungan berkode tangan:
    • Optional: Mengatur kata kunci warna untuk digunakan dengan bercabang dinamis. Anda dapat menggunakan bercabang dinamis tanpa kata kunci naungan, tetapi ini menyediakan konfigurasi sederhana dan per-bahan.
    • Gunakan if statement yang mengevaluasi kata kunci naungan (jika digunakan) atau keadaan runtime lainnya. Anda dapat menggunakan atribut untuk memaksa GPU untuk menjalankan kedua cabang, atau untuk mengeksekusi hanya satu cabang.
  • Di Shader Graph, gunakan . Ini selalu mengeksekusi kedua cabang.
Kondisi dalam naungan
Varietas Shader