Variabel naungan internal
Menggunakan state sampler

Jenis data dan presisi Shader

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.

Jenis data dasar

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):

Presisi tinggi: 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.

Presisi sedang: 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.

Presisi rendah: 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.

Mengintegrasikan jenis data

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.

Komposit vektor/matrix Login

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.

Tekstur / Jenis sampel

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;

Presisi, Dukungan Perangkat Keras dan Kinerja

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 infinities, NaNs dan nilai titik mengambang khusus lainnya

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.

GPU Sitemap

Vendor GPU memiliki panduan mendalam tentang kinerja dan kemampuan GPU mereka. Lihat ini untuk rincian:

Lihat Juga

Variabel naungan internal
Menggunakan state sampler