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 pastebinPengganti 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 PastebinTambahkan 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 PastebinKode Shader menggantikan Toon shader: tautan ke PastebinKode Efek Gambar Shader: Tautan ke PastebinC # Blit Script: Pastebin LinkC # skrip sakelar visi termal: tautan ke PastebinGambar 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