Mengganti naungan pada runtime
Kesalahan dan memuat naungan

Compute shaders

Switch to Scripting

Membandingkan naungan adalah program shaderProgram yang berjalan di GPU. More info
Lihat di Glossary
yang berjalan di GPU, di luar pipa rendering normal.

Mereka dapat digunakan untuk algoritma GPGPU paralel besar, atau untuk mempercepat bagian rendering permainan. Untuk secara efisien menggunakannya, pengetahuan mendalam tentang arsitektur GPU dan algoritma paralel sering diperlukan; serta pengetahuan DirectCompute, OpenGL Compute, CUDA, atau OpenCL.

Mempercepat naungan dalam persatuan pertandingan erat DirectX 11 teknologi DirectCompute. Platform di mana warna compute bekerja:

  • Windows dan Windows Store, dengan DirectX 11 atau DirectX 12 API grafis dan Shader Model 5.0 GPU

  • macOS dan iOS menggunakan API Grafik logam API

  • Android, Linux dan platform Windows dengan API Vulkan API

  • Platform OpenGL modern (OpenGL 4.3 di Linux atau Windows; OpenGL ES 3.1 di Android). Catatan bahwa Mac OS X tidak mendukung OpenGL 4.3

  • Konsol modern

Memungkinkan dukungan naungan dapat dikueriasi runtime menggunakan SystemInfo.supportsComputeShaders.

Compute shader Assets

Mirip dengan aset naungan aset warna, compute adalah file dalam proyek Anda. dengan ekstensi file .compute. Mereka ditulis dalam bahasa DirectX 11 gaya HLSL, dengan jumlah minimal #pragma kompilasi langsung untuk menunjukkan fungsi mana untuk mengkompilasi sebagai biji naungan compute.

Berikut ini contoh dasar dari file warna compute, yang mengisi tekstur output dengan merah:

// test.compute

#pragma kernel FillWithRed

RWTexture2D<float4> res;

[numthreads(1,1,1)]
void FillWithRed (uint3 dtid : SV_DispatchThreadID)
{
    res[dtid.xy] = float4(1,0,0,1);
}

Bahasa adalah standar DX11 HLSL, dengan tambahan#pragma kernel FillWithRed directive. Satu file aset naungan wajib mengandung setidaknya satucompute kernel yang dapat diinvoked, dan fungsi itu ditunjukkan oleh #pragma directive. Ada lebih banyak kernel dalam file; cukup tambahkan beberapa garis #pragma kernel.

Saat menggunakan beberapa garis #pragma kernel, perhatikan bahwa komentar dari gaya // text tidak diizinkan pada garis yang sama dengan arahan #pragma kernel, dan menyebabkan kesalahan kompilasi jika digunakan.

Garis #pragma kernel dapat secara opsional diikuti oleh sejumlah makro preprocessor untuk menentukan sementara mengkompensasi kernel itu, misalnya:

#pragma kernel KernelOne SOME_DEFINE DEFINE_WITH_VALUE=1337
#pragma kernel KernelTwo OTHER_DEFINE
// ...

Mencerahkan naungan compute

Dalam skrip Anda, menentukan variabel jenis ComputeShader dan menetapkan referensi ke Aset. Ini memungkinkan Anda untuk memanggil mereka dengan fungsi ComputeShader.Dispatch. Lihat dokumentasi Unity pada ComputeShader class untuk informasi lebih lanjut.

Lebih dekat terkait dengan warna compute adalah kelas ComputeBuffer, yang mendefinisikan penyangga data sewenang-wenang (“serangga terstruktur” di DX11 lingo). Tekstur RenderJenis Tekstur khusus yang diciptakan dan diperbarui pada runtime. Untuk menggunakannya, pertama membuat Tekstur Render baru dan menunjuk salah satu Kamera Anda untuk membuatnya. Kemudian Anda dapat menggunakan Tekstur Render dalam Bahan seperti Tekstur biasa. More info
Lihat di Glossary
juga dapat ditulis ke dalam dari pendinginan compute, jika mereka memiliki set bendera "layanananan" ("penampilan akses berurutan" di DX11). Lihat RenderTexture.enableRandomWrite untuk mempelajari lebih lanjut tentang ini.

Tekstur sampler dalam warna compute

Tekstur dan sampler tidak memisahkan benda di Unity, sehingga menggunakannya dalam warna compute Anda harus mengikuti salah satu aturan khusus Unity berikut:

  • Gunakan nama yang sama dengan nama Tekstur, dengan sampler pada awal (misalnya, Texture2D MyTex; SamplerState samplerMyTex). Dalam kasus ini, sampler diinisialisasikan ke pengaturan filter / filter / filter / iso tekstur.

  • Gunakan sampler yang telah ditentukan. Untuk ini, nama harus memiliki Linear atau Point (untuk mode filter) dan Clamp atau Repeat (untuk mode bungkus). Misalnya, SamplerState MyLinearClampSampler menciptakan sampler yang memiliki mode filter Linear dan mode pembungkus Clamp.

Untuk informasi lebih lanjut, lihat dokumentasi pada Sampler States.

Dukungan lintas platform

Seperti pada naungan biasa, Unity mampu teduh menyusut translating dari HLSL ke bahasa naungan lainnya. Oleh karena itu, untuk pembangun lintas platform termudah, Anda harus menulis naungan compute di HLSL. Namun, ada beberapa faktor yang perlu dipertimbangkan ketika melakukan ini.

Praktik terbaik lintas platform

DirectX 11 (DX11) mendukung banyak tindakan yang tidak didukung pada platform lain (seperti Metal atau OpenGL ES). Oleh karena itu, Anda harus selalu memastikan naungan Anda memiliki perilaku yang ditentukan dengan baik pada platform yang menawarkan dukungan yang kurang, bukan hanya pada DX11. Berikut adalah beberapa hal yang perlu dipertimbangkan:

  • Akses memori luar batas buruk. DX11 mungkin secara konsisten kembali nol ketika membaca, dan membaca beberapa menulis tanpa masalah, tetapi platform yang menawarkan dukungan kurang mungkin crash GPU ketika melakukan ini. Tonton keluar untuk hacks spesifik DX11, ukuran penyangga tidak cocok dengan beberapa ukuran kelompok benang Anda, mencoba membaca elemen data tetangga dari awal atau akhir penyangga, dan ketidakpastian serupa.

  • Menawarkan sumber daya Anda. Konten penyangga dan Tekstur baru tidak ditentukan. Beberapa platform mungkin memberikan semua nol, tetapi pada orang lain, bisa ada apa pun termasuk NaNs.

  • Bind semua sumber daya naungan compute Anda menyatakan. Bahkan jika Anda tahu pasti bahwa naungan tidak menggunakan sumber daya dalam keadaan saat ini karena bercabang, Anda harus tetap memastikan sumber daya terikat untuk itu.

Perbedaan spesifik platform

  • Metal (untuk platform iOS dan tvOS) tidak mendukung operasi atom pada Tekstur. Logam juga tidak mendukung pertanyaan GetDimensions pada penyangga. Lulus informasi ukuran penyangga sebagai konstan ke naungan jika diperlukan.

  • OpenGL ES 3.1 (untuk (Android, iOS, platform tvOS) hanya menjamin dukungan untuk 4 buffer compute pada waktu. Implementasi aktual biasanya mendukung lebih banyak, tetapi pada umumnya jika berkembang untuk OpenGL ES, Anda harus mempertimbangkan data terkait kelompok dalam merusak daripada memiliki setiap item data dalam penyangganya sendiri.

HLSL-only atau GLSL-only compute shaders

Biasanya, compute file naungan ditulis dalam HLSL, dan dikompilasi atau diterjemahkan ke semua platform yang diperlukan secara otomatis. Namun, dimungkinkan untuk mencegah terjemahan ke bahasa lain (yaitu, hanya menyimpan platform HLSL), atau menulis kode compute GLSL secara manual.

Informasi berikut hanya berlaku untuk HLSL-only atau GLSL-only compute shaders, tidak cross-platform builds. Ini karena informasi ini dapat mengakibatkan sumber naungan compute dikecualikan dari beberapa platform.

  • Mengisi sumber naungan dikelilingi oleh kata kunci CGPROGRAM dan ENDCG tidak diproses untuk platform non-HLSL.

  • Mengisi sumber naungan dikelilingi oleh kata kunci GLSLPROGRAM dan ENDGLSL diperlakukan sebagai sumber GLSL, dan kata kerja yang dipancarkan. Ini hanya bekerja ketika menargetkan platform OpenGL atau GLSL. Anda juga harus dicatat bahwa sementara secara otomatis menerjemahkan naungan mengikuti tata letak data HLSL pada penyangga, secara manual ditulis GLSL naungan mengikuti aturan tata letak GLSL.

Varian dan kata kunci

Anda dapat menggunakan kata kunci untuk menghasilkan beberapa varian warna compute, sama seperti yang Anda dapat untuk penanam grafis.

Untuk informasi umum tentang varian, lihat Varietas ShaderSebuah verion dari program naungan yang Unity menghasilkan sesuai dengan kombinasi khusus kata kunci naungan dan status mereka. Objek Shader dapat mengandung beberapa varian naungan. More info
Lihat di Glossary
. Untuk informasi tentang cara mengimplementasikan fitur-fitur ini dalam penjuk compute, lihat Mengatur dan menggunakan kata kunci naungan di HLSL dan Login API documentation.

Mengganti naungan pada runtime
Kesalahan dan memuat naungan