Standar ShaderProgram yang berjalan di GPU. More info
Lihat di Glossary bahasa di Unity adalah HLSL, dan umum HLSL data jenis didukung. Namun, Unity memiliki beberapa tambahan untuk jenis HLSL, terutama untuk dukungan yang lebih baik pada platform seluler.
Mayoritas perhitungan dalam naungan dilakukan pada nomor titik mengambang (yang akan menjadi float
dalam bahasa pemrograman reguler seperti C #). Beberapa varian dari jenis titik mengambang hadir: float
, half
dan fixed
(serta varian vektor/matrix dari mereka, seperti half3
dan float4x4
). Jenis-jenis ini berbeda dalam presisi (dan, akibatnya, kinerja atau penggunaan daya):
float
Nilai titik mengambang presisi tertinggi; umumnya 32 bit (seperti float
dari bahasa pemrograman biasa).
Ketepatan float
penuh umumnya digunakan untuk posisi ruang dunia, koordinat tekstur, atau komputasi scalar yang melibatkan fungsi kompleks seperti trigonometry atau power/exponentiation.
half
Nilai titik mengambang presisi menengah; umumnya 16 bit ( kisaran -60000 hingga +60000, dengan sekitar 3 digit desimal presisi).
Setengah presisi berguna untuk vektor pendek, arah, posisi ruang objek, warna rentang dinamis tinggi.
fixed
Nilai titik tetap presisi paling rendah. Umumnya 11 bit, dengan kisaran -2.0 hingga + 2.0 dan 1/256th presisi.
Ketepatan tetap berguna untuk warna biasa (seperti biasanya disimpan dalam tekstur biasa) dan melakukan operasi sederhana pada mereka.
Pengintegrasian (tipe dataint
) sering digunakan sebagai counter loop atau indeks array. Untuk tujuan ini, mereka umumnya bekerja dengan baik di berbagai platform.
Tergantung pada platform, tipe integer mungkin tidak didukung oleh GPU. Sebagai contoh, Direct3D 9 dan OpenGL ES 2.0 GPUs hanya beroperasi pada data titik mengambang, dan ekspresi integer yang terlihat sederhana (dalam operasi bit atau logis) mungkin digambar menggunakan instruksi matematika titik mengambang yang cukup rumit.
Direct3D 11, OpenGL ES 3, Logam dan platform modern lainnya memiliki dukungan yang tepat untuk jenis data integer, sehingga menggunakan sedikit pergeseran dan sedikit masking bekerja seperti yang diharapkan.
HLSL memiliki tipe vektor dan matriks bawaan yang diciptakan dari jenis dasar. Misalnya, float3
adalah vektor 3D dengan komponen .x, .y, .z, dan half4
adalah vektor 4D presisi menengah dengan .x, .y, .z, komponen .w. Atau, vektor dapat diindeks menggunakan .r, .g, .b, .a komponen, yang berguna ketika bekerja pada warna.
Jenis matriks dibangun dengan cara yang sama; misalnya float4x4
adalah matriks transformasi 4x4. Perhatikan bahwa beberapa platform hanya mendukung matriks persegi, sebagian besar OpenGL ES 2.0.
Biasanya Anda menyatakan tekstur dalam kode HLSL Anda sebagai berikut:
sampler2D _MainTex;
samplerCUBE _Cubemap;
Untuk platform seluler, ini diterjemahkan ke dalam "kursus presisi rendah", yaitu tekstur diharapkan memiliki data presisi rendah di dalamnya. Anda dapat mengubah presisi sampler default untuk seluruh proyek Unity di Player SettingsPengaturan yang memungkinkan Anda mengatur berbagai pilihan khusus pemain untuk permainan akhir yang dibangun oleh Unity. More info
Lihat di Glossary menggunakan dropdown Model presisi Shader. Jika Anda tahu tekstur Anda mengandung warna HDRkisaran dinamis tinggi
Lihat di Glossary, Anda mungkin ingin menggunakan sampel presisi setengah:
sampler2D_half _MainTex;
samplerCUBE_half _Cubemap;
Atau jika tekstur Anda mengandung data presisi float penuh (misalnya tekstur kedalaman), gunakan sampler presisi penuh:
sampler2D_float _MainTex;
samplerCUBE_float _Cubemap;
Satu komplikasi penggunaan tipe data float
/ half
/fixed
adalah bahwa PC GPUs adalah presisi tinggi always. Itu, untuk semua PC (Windows / Mac / Linux) GPU, itu tidak masalah apakah Anda menulis float
, half
atau jenis data fixed
di naungan Anda. Mereka selalu mematuhi segala sesuatu dalam presisi titik mengambang 32-bit penuh.
Jenis half
dan fixed
hanya menjadi relevan ketika menargetkan GPU seluler, di mana jenis ini terutama ada untuk kekuatan (dan kadang-kadang kinerja) kendala. Perlu diingat bahwa Anda harus menguji naungan Anda di ponsel untuk melihat apakah atau tidak Anda berjalan ke masalah presisi / numerik.
Bahkan di GPU seluler, dukungan presisi yang berbeda bervariasi antara keluarga GPU. Berikut ini ikhtisar tentang bagaimana setiap keluarga GPU seluler memperlakukan setiap tipe titik mengambang (diindikasikan oleh jumlah bit yang digunakan untuk itu):
Login Login | float | half | fixed |
---|---|---|---|
Seri PowerVR 6/7 | 32 | 16 g | |
Mozilla Firefox 64 ... | 32 | 16 g | 1 Artikel |
Mozilla Firefox 57.0.1 ... | 32 | 16 g | |
Mozilla Firefox 64 ... | 32 simpul 24 fragmen | ||
ARM Mali T6xx/7xx | 32 | 16 g | |
Login Brunei 400/450 | 32 simpul 16 fragmen | ||
NVIDIA X1 | 32 | 16 g | |
NVIDIA K1 | 32 | ||
Login Tegra 3/4 | 32 | 16 g |
Kebanyakan GPU seluler modern sebenarnya hanya mendukung nomor 32-bit (digunakan untuk tipe float
) atau nomor 16-bit (digunakan untuk jenis half
dan fixed
). Beberapa GPU yang lebih tua memiliki ketepatan yang berbeda untuk komputasi naungan vertex shaderProgram yang berjalan pada setiap simpul model 3D ketika model sedang diberikan. More info
Lihat di Glossary dan fragmen.
Menggunakan presisi lebih rendah sering bisa lebih cepat, baik karena peningkatan alokasi register GPU, atau karena unit eksekusi “perjalanan cepat” khusus untuk operasi matematika presisi rendah tertentu. Bahkan ketika tidak ada keunggulan kinerja mentah, menggunakan presisi lebih rendah sering menggunakan daya yang kurang pada GPU, yang menyebabkan masa pakai baterai yang lebih baik.
Aturan umum thumb adalah untuk memulai dengan setengah presisi untuk segala sesuatu kecuali posisi dan koordinat tekstur. Hanya meningkatkan presisi jika setengah presisi tidak cukup untuk beberapa bagian perhitungan.
Dukungan untuk nilai-nilai titik mengambang khusus dapat berbeda tergantung pada keluarga GPU mana (paling mobile) Anda berjalan.
Semua PC GPU yang mendukung dukungan Direct3D 10 dengan standar titik mengambang IEEE 754. Ini berarti bahwa jumlah pelampung berperilaku persis seperti yang mereka lakukan dalam bahasa pemrograman biasa pada CPU.
Ponsel GPU dapat memiliki tingkat dukungan yang sedikit berbeda. Pada beberapa, membagi nol dengan nol mungkin menyebabkan NaN ("bukan nomor"); pada orang lain itu mungkin mengakibatkan ketidakpastian, nol atau nilai yang tidak ditentukan lainnya. Pastikan untuk menguji naungan Anda pada perangkat target untuk memeriksa mereka didukung.
Vendor GPU memiliki panduan mendalam tentang kinerja dan kemampuan GPU mereka. Lihat ini untuk rincian: