Halo semuanya! Nama saya Grigory Dyadichenko, dan saya adalah pendiri dan CTO dari Foxsys Studios. Hari ini saya ingin berbicara tentang shader. Kemampuan untuk menulis shader (dan umumnya bekerja dengan rendering) sangat penting ketika mengembangkan untuk platform seluler atau AR / VR, jika Anda ingin mencapai grafik yang keren. Banyak pengembang berpikir bahwa shader adalah sihir. Bahwa ada sedikit informasi yang baik tentang mereka, dan bahwa untuk menulisnya, Anda harus memiliki, minimal, judul kandidat sains. Ya, pengembangan shader dengan prinsip mereka sangat berbeda dari pengembangan klien. Tetapi yang utama adalah memahami prinsip-prinsip dasar shader, serta mengetahui esensi mereka, sehingga tidak ada yang ajaib dan pencarian informasi tentang topik ini adalah tugas yang sederhana. Seri artikel ini ditujukan untuk pemula, jadi jika Anda pandai memprogram shader, seri ini tidak akan menarik bagi Anda. Siapa pun yang ingin memahami topik ini - selamat datang di bawah potongan!

Ini adalah artikel pengantar di mana saya akan menjelaskan prinsip-prinsip umum penulisan shader. Jika topiknya menarik, maka kami akan menganalisis secara lebih rinci dalam artikel terpisah: vertex shaders, shaders geometris, shaders fragmen / pixel, shaders triplanar, efek screenspace dan shaders komputer (OpenCL, CUDA, dll.). Dan secara umum, semua keajaiban itu bisa dilakukan pada GPU. Ini akan disortir dalam konteks pipa standar Unity. Jadi LWRP dan HDRP sejauh ini tampak agak lembab bagi saya.
Apa itu shader?
Sumber: www.shadertoy.com/view/MsGSRdSebenarnya, ini adalah program yang berjalan pada GPU, yang hasilnya adalah informasi yang berbeda. Dalam vertex shaders, ini adalah parameter dari simpul mesh. Pixel shaders dieksekusi pixel demi pixel.
Untuk memahami cara kerja shader, Anda perlu memberi tahu apa itu pipeline grafik. Sangat sering orang berbicara tentang topik ini dengan kata-kata yang agak rumit, tetapi kami akan membuatnya sedikit lebih mudah untuk dipahami. Ambil contoh OpenGL. Dalam hal ini, saya sangat suka gambar ini.

Jika Anda menghilangkan bagian yang terkait dengan pencahayaan, dll. Secara umum, dari sudut penulisan shiter Unlit yang sama pada hlsl, esensinya adalah sebagai berikut. Kami memiliki shader
#pragma vertex vert #pragma fragment frag
di mana kita menentukan bahwa bagian simpul shader akan ditulis dalam fungsi vert, dan bagian fragmen dalam fungsi frag.
Struktur yang kami jelaskan di shader menentukan data apa yang akan kami ambil dari mesh dan setelah diproses dengan vertex shader yang menggantung pada objek MeshRenderer dan MeshFilter kami.
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; };
Selanjutnya, vertex shader menghitung dengan menerima data appdata sebagai input dan memberikan hasilnya dalam bentuk struktur v2f, yang kemudian menuju ke fragmen shader. Yang pada gilirannya akan menghitung warna piksel. Karena informasi v2f ditulis hanya untuk simpul (yang lebih kecil dari piksel), data di bagian fragmen diinterpolasi. Semua ini dapat direpresentasikan sebagai fakta bahwa vert dipertimbangkan dalam setiap vertex secara independen. Kemudian hasilnya ditransfer ke bagian fragmen, di mana frag untuk setiap piksel dianggap independen. Karena perhitungan dilakukan secara paralel, di bagian ini tidak ada informasi tentang tetangga (jika Anda tidak mengirimkannya dengan cerdik).
Secara lebih rinci, semua nuansa, serta banyak contoh dijelaskan dalam dokumentasi Unity
docs.unity3d.com/Manual/SL-Reference.htmlBahasa Pemrograman Shader
Sumber: www.shadertoy.com/view/WsS3DcApa lagi yang penting agar tidak dilupakan. Fakta bahwa shader sekarang ditulis dalam tiga bahasa pemrograman yang tidak ada hubungannya dengan persatuan. CG, GLSL dan HLSL. Cara termudah untuk menulis shader dalam satu unit adalah melalui HLSL, karena di situlah file shader dengan izin .shader ditulis. Dan jika ada relatif sedikit informasi tentang shader dalam konteks unit, maka informasi secara terpisah tentang HLSL, GLSL dan CG hanya berton-ton. Dokumentasi untuk shaders menjelaskan cara mentransfer apa yang ditulis dalam bahasa-bahasa ini ke Unity. Oleh karena itu, ternyata hampir semua informasi secara umum tentang bahasa pemrograman ini valid. Ketiga bahasa sangat mirip dengan C, tetapi masing-masing memiliki karakteristik sendiri.
Lebih jauh, dari sudut pandang mempelajari shader, ketika bahasa-bahasa ini tidak lagi menimbulkan pertanyaan, Anda dapat melihat peluang apa "UnityCG.cginc" dan perpustakaan lain yang ditulis oleh persatuan menyediakan sendiri untuk menyederhanakan pekerjaan mereka.
Kenapa kalau di shader itu buruk?
Sumber: www.shadertoy.com/view/Md3cWrPenting untuk memahami bagaimana shader dieksekusi pada tingkat besi dan mengapa mereka begitu cepat sehingga mereka dapat melakukan jutaan operasi tanpa melelahkan.
Gagasan utama GPU adalah paralelisme maksimum perhitungan. Di sini perlu untuk memperkenalkan konsep seperti itu sebagai "gelombang depan". Sebenarnya, ini cukup sederhana, wavefront adalah sekelompok shader yang melakukan urutan operasi yang sama. Artinya, dari sudut pandang GPU, opsi terbaik adalah ketika instruksi yang sama dijalankan pada waktu yang sama. Satu-satunya perbedaan dalam eksekusi adalah input. Masalah percabangan adalah bahwa suatu situasi dapat terjadi ketika dalam satu kelompok shader, shader harus menjalankan operasi yang berbeda. Yang pada gilirannya mengarah pada pembuatan wavefront baru, menyalin data ke dalamnya, dll. Dan itu sangat mahal.
Ada nuansa dan pengecualian, tetapi untuk bisa menulis dengan aman, Anda harus memahami bagaimana perilakunya pada versi target api grafis. Karena OpenGL ES 2 atau DX11 yang sama dalam hal ini sangat berbeda.
Mengapa saya perlu tahu ini, karena ada editor simpul?

Penting untuk memahami bahwa editor simpul adalah alat utama bagi seniman teknis. Ini adalah spesialis yang memiliki keahlian dalam matematika, tetapi lebih banyak desainer. Shader tipe wireframe (di mana pemahaman tentang koordinat barycentric diperlukan) atau transformasi ke koordinat Cartesian, yang digunakan untuk proyeksi rumit, jauh lebih mudah dilakukan dengan kode, seperti banyak model matematis dari bahan fisik. Pada saat yang sama, dari sudut pandang programmer shader, Anda pada dasarnya membuat simpul dan alat khusus untuk seniman teknis untuk membuat keajaiban nyata. Editor node memiliki fungsi terbatas dari sudut pandang ini. Oleh karena itu, penting untuk dapat menulis shader dalam bahasa seperti hlsl. Memahami cara kerja rendering, dll.
Sumber Daya yang Berguna untuk Belajar
Sumber: www.shadertoy.com/view/4tlcWjDalam hal mempelajari pemrograman shader, latihan yang baik adalah menulis ulang shader dari
www.shadertoy.com atau
glslsandbox.com . Selain itu, ada profil keren dari spesialis dari Unity, di mana Anda dapat melihat banyak
github.com/keijiro yang menarik
Yang lainnya adalah matematika dan pemahaman tentang fisika efek. Ini agak mirip dengan mencampur bahan-bahan, jika masalah spesifik pemodelan fisik tidak terpecahkan. Banyak hal menarik yang dapat dilakukan dengan mencampur kebisingan, refraksi, hamburan cahaya di bawah permukaan, kaustik, efek Fresnel, reaksi difusi dan sifat fisik benda lainnya. Secara umum, pemrograman shader tentu saja tidak elementer, dan ada tempat untuk menggali lebih dalam.
Jika topik shader menarik, maka saya akan mencoba untuk merilis serangkaian artikel tentang topik ini, sudah dengan contoh dan tutorial khusus tentang topik menciptakan efek yang berbeda. Sarankan dalam komentar tentang apa yang Anda ingin baca dan topik apa yang akan dipelajari. Terima kasih atas perhatian anda!
Semua efek dalam artikel adalah rekaman efek shader dengan shadertoy.