Sedang menonton Liga Rocket dan melihat ada stiker dan roda beranimasi.
.
Saya ingin menerapkan sesuatu yang mirip dengan efek pada gambar di atas.
Bagaimana saya bisa menulis Unity Shader untuk melakukan efek roda?
Saya tidak tahu banyak tentang Shader, tetapi bisakah saya mengedit standar Unity Shader untuk melakukan efek animasi?
_Time
variabel bawaan yang dapat Anda tambahkan ke koordinat tekstur dalam shader (vertex) untuk mendapatkan efek gulir yang murah. Efek hexagon akan sangat mudah juga. Jika Anda mengedit pertanyaan Anda untuk menyoroti hanya satu efek dan bertanya "bagaimana saya menerapkan ini dalam shader Persatuan," kami mungkin dapat membantu Anda. Pastikan untuk menentukan apakah shader perlu merespons pencahayaan / bayangan, karena hal itu berdampak pada bagaimana hal itu akan ditulis.Jawaban:
Saya akan membangun ini dalam beberapa lapisan sehingga Anda dapat melihat bagaimana ia datang bersama-sama.
Mulailah dengan membuat shader baru di Unity dengan memilih
Create --> Shader --> Unlit
menu Aset atau menu konteks klik kanan di jendela Proyek.Di blok atas kami akan menambahkan
_ScrollSpeeds
parameter untuk mengontrol seberapa cepat tekstur bergerak di setiap arah:Ini memperlihatkan properti float 4-komponen baru di inspektur material, dengan nama ramah "Kecepatan Gulir" (mirip dengan menambahkan
public
atauSerialized
variabel keMonoBehaviour
skrip)Selanjutnya kita akan menggunakan variabel ini di Vertex shader untuk menggeser koordinat tekstur (
o.uv
), dengan menambahkan hanya dua baris ke shader default:Menampar itu pada quad (dengan tekstur jerapah gratis yang indah oleh Kenney ) dan Anda mendapatkan:
Untuk mendapatkan tekstur menggulir ke luar dalam sebuah cincin, kita bisa menggunakan mesh yang dibagi seperti spiderweb, dengan koordinat uv v meningkat dari tengah ke luar. Tapi itu akan memberikan beberapa artefak berbentuk gergaji sendiri. Sebagai gantinya, saya akan menunjukkan bagaimana kita dapat menghitung UV per fragmen.
Ini sedikit lebih mahal, baik karena operasi trigonometri & panjang (yang lebih mahal daripada matematika dasar) dan karena itu tidak seefisien untuk memprediksi & menyimpan data tekstur dalam perangkat keras ketika menghitung texcoords per fragmen, dibandingkan dengan hanya menginterpolasi mereka. antar simpul. Tetapi untuk efek khusus kecil seperti ini, tidak berlebihan
Itu memberi kita sesuatu seperti ini (di sini saya meningkatkan parameter ubin dalam materi sehingga lebih jelas apa yang terjadi - hanya dengan mengulangi satu kali ubin di sekitar lingkaran terlihat terdistorsi dan aneh)
Terakhir, untuk mewarnai tekstur dengan gradien pengguliran, kita bisa menambahkan gradien sebagai tekstur kedua dan mengalikannya menjadi satu.
Pertama kita tambahkan parameter tekstur baru di atas:
Dan mendeklarasikannya di blok CGPROGRAM kami sehingga CG shader dapat melihatnya:
Kemudian perbarui shader fragmen kami untuk menggunakan kedua tekstur:
Dan sekarang jerapah kita menjadi sangat trippy:
Dengan pemilihan tekstur dan laju gulir yang sedikit lebih artistik, ini dapat membuat efek yang sangat mirip dengan yang ditunjukkan dalam pertanyaan.
Anda mungkin melihat dua artefak kecil dengan versi yang saya perlihatkan di atas:
Wajah-wajah di dekat pusat lingkaran menjadi melar / kurus / runcing, kemudian ketika mereka bergerak ke arah luar, mereka tergencet / melebar.
Distorsi ini terjadi karena kami memiliki jumlah wajah yang tetap di sekeliling perimeter, tetapi keliling yang mereka rentang semakin lebar seiring dengan meningkatnya jari-jari, sementara tingginya tetap sama.
Kita dapat memperbaikinya dengan memetakan kembali komponen vertikal dari sampel tekstur untuk mengikuti kurva logaritmik, sehingga pengulangan tekstur semakin terpisah ketika jari-jari meningkat, dan lebih dekat bersama-sama menuju pusat. (Bahkan, ini memberi kita kemunduran jerapah yang lebih kecil dan lebih kecil ...)
Ada deretan satu atau dua piksel buram di sepanjang kiri tengah quad.
Ini terjadi karena GPU melihat dua koordinat sampel tekstur yang berdekatan untuk mencari tahu penyaringan apa yang digunakan. Ketika sampel berdekatan, itu menunjukkan tekstur sedang ditampilkan besar / dekat dan menunjukkan tingkat mip paling rinci. Ketika sampel berjauhan, kita harus menunjukkan tekstur pada zoom kecil atau jauh, dan sampel dari mipmap yang lebih kecil / blur untuk memastikan kita tidak mendapatkan artefak aliasing yang berkilau.
Masalahnya ada di sini, kita berada di titik pembungkus dalam koordinat kutub, dari -180 hingga 180 derajat. Jadi kita benar-benar mengambil sampel dari titik-titik yang sangat mirip di ruang tekstur berulang kami, bahkan jika koordinat numerik mereka membuatnya terlihat seperti mereka berjauhan. Jadi kami dapat menyediakan vektor gradien sampling kami sendiri untuk memperbaikinya.
Inilah versi dengan koreksi ini:
sumber
tex2Dgrad
perbaikan artefak penyaringan di mana sudut membungkus dari -pi ke + pi (itu adalah garis tipis piksel kabur di sisi kiri). Inilah hasil yang disentuh dengan lebih banyak warna biru