Visi Predator: Efek Penglihatan Termal


Saat mencari implementasi thermal shader terbaik, saya menemukan matcap shader yang diterbitkan oleh bgolus di forum Unity - titik awal yang baik.

Saya banyak mengubahnya untuk membuat model terlihat lebih konsisten di sudut yang berbeda, mengikat topi ke simpul dan normal. Sebenarnya, ini bukan lagi matcap, tapi saya masih ingin membayar upeti kepada shader ini, dari mana semuanya dimulai.


Kami akan bergerak secara berurutan, pertama fungsi simpul:

1. Normal dari objek:

float3 v.normal; 

2. Posisi vertex yang dinormalisasi, dimulai dari titik referensi model

 float3 vertexN = normalize(v.vertex); 

3. Produk vektor dari nilai-nilai ini:

 float3 viewCross = cross(vertexN, v.normal); 

4. Pisahkan crossproduct.xy dan bias untuk membuat hasil yang lebih merata

 o.cap = viewCross.xy * 0.5 + 0.5; 

Dalam fungsi fragmen

5. Buat topeng dan gandakan

 fixed4 m = tex2D(_Mask, i.uv); i.cap *= (1 - mg); 

6. Proyeksikan tekstur warna ke hasilnya. (Saya menggunakan gaya oranye-ungu, tetapi Anda dapat menggunakan gradien yang lebih besar atau sesuatu yang lain)


 fixed4 color = tex2D(_Matcap, i.cap); 

Itu saja, shader termal sudah siap; Poin pentingnya adalah Anda harus memberikan label sendiri sehingga skrip pengganti menyetelnya dengan benar, jadi pastikan label itu berisi ini:

  Tags{ "ThermalVision" = "ThermalColors"} 

Inilah shader lengkapnya: Tautan pastebin

Pengganti shader


Agar thermal shader dapat menggantikan yang lain, Anda hanya perlu menerapkan label yang sama ke shader yang perlu diganti:

 Tags{ "ThermalVision" = "ThermalColors"} 

Dan pastikan semua properti yang diperlukan terbuka untuk shader yang dapat diganti:

 _Mask("G = no thermal", 2D) = "black" {} _Matcap("Matcap", 2D) = "white" {} _Strength("Mask Strength", Range(0,2)) = 0.4 

Untuk mengganti shader, Anda perlu menambahkan kamera kedua dan memanggilnya

 camera.SetReplacementShader(Shader, "NamedShader"); 
.


Jadi buat kamera baru, dan buat itu menjadi anak dalam kaitannya dengan kamera utama, dan kemudian reset posisi dan rotasi sehingga mereka berada dengan cara yang sama.


Atur ke Warna Solid dan latar belakang hitam.


Dalam "Pratinjau Kamera" Anda harus melihat semuanya sama seperti di kamera normal, hanya tanpa skybox, dengan latar belakang hitam.

Sudah waktunya untuk mengubah shader,

Tambahkan variabel publik Shader dan seret shader efek termal ke atasnya.

Kemudian tambahkan kamera sebagai variabel baru dan di Mulai panggilan SetReplacementShader menggunakan publik shader dan nama yang diberikan dalam label

  public Shader ThermalShader; Camera cam; void Start() { cam = GetComponent<Camera>(); cam.SetReplacementShader(ThermalShader, "ThermalVision"); } 


Setelah memulai, Anda akan melihat efek termal hanya pada jerat dengan shader yang diganti.

Efek gambar



Pada tahap ini, shader termal terlihat jelas, tetapi tidak ada yang terlihat selain itu. Untuk mengembalikan lingkungan ke kamera, saya menggunakan tekstur DepthNormals sebagai Efek Gambar dalam kombinasi dengan tekstur Buram.

Image Effect Shader: Tautan ke Pastebin

Tambahkan skrip blit sederhana ini ke kamera termal dan seret shader dengan Image Effect

Saya meletakkan gambar yang sama seperti pada shader termal, tetapi Anda dapat menggunakan yang lain!

Script Pengalih Visi Termal



Sekarang, aktifkan saja selama pertandingan.



Untuk mengganti variabel Boolean, yang mencakup kamera, melakukan penggantian dan jumlah pasca pemrosesan, saya menggunakan tombol T. Untuk beralih kembali, tekan T. lagi.

Untuk menyelesaikan, tambahkan sedikit pasca-pemrosesan ke ruang termal. Saya menambahkan Chromatic Abberation and Depth of Field.

Berikut ini skrip switching penglihatan termal: tautan ke Pastebin Link

(Saat menggunakan PPS 2, Anda mungkin perlu meningkatkan ke versi yang lebih baru dari tumpukan Post Processing)

Opsional


Jika Anda tidak ingin efeknya bersinar melalui dinding, maka untuk kamera pengganti, atur "Solid Color" ke "Don't Clear". Jika Anda ingin skybox menjadi hitam juga, maka dalam kode sakelar, cache material skybox dan atur menjadi nol

 Private Material SkyboxMaterial; skyboxMaterial = RenderSettings.skybox; RenderSettings.skybox = null; 

dan kemudian mengembalikannya ketika efek termal dimatikan:

 RenderSettings.skybox = skyboxMaterial; 



Sekarang ini kurang seperti mekanisme permainan dan lebih seperti efek visual yang sederhana.

Mulai cepat jika Anda tidak tertarik dengan penjelasan


1. Unduh shader efek termal

2. Unduh "ThermalVision" = "ThermalColors" Toon yang diganti ATAU tambahkan ke shader Anda sendiri "ThermalVision" = "ThermalColors" dan variabel _Matcap , _Mask , _Strength .

3. Buat kamera kedua, anak perempuan untuk yang utama, atur ke Solid Color, Black Background

4. Ambil shader termal dengan Efek Gambar , buat bahan dan tambahkan skrip ThermalBlit ke kamera kedua ini dengan menyeret materi ini.

5. Tambahkan skrip ThermalController , seret shader efek termal, tambahkan jumlah post-processing (opsional)

6. Tekan T untuk menghidupkan visi. (Apa yang harus ditampilkan harus diganti dengan shader).

Sumber daya


Kode Thermal Shader: Tautan Pastebin

Kode Shader menggantikan Toon shader: tautan ke Pastebin

Kode Efek Gambar Shader: Tautan ke Pastebin

C # Blit Script: Pastebin Link

C # skrip sakelar visi termal: tautan ke Pastebin

Gambar matcap:





Informasi tambahan tentang shader yang dapat diganti:

Ini adalah video lama dari mana saya pertama kali mempelajarinya: Video tentang Penggantian Shaders dengan Membuat barang terlihat bagus di Unity

Source: https://habr.com/ru/post/id482928/


All Articles