Saya mencoba membuat efek berkilauan untuk shader waktu nyata saya, tetapi saya tidak tahu caranya.
Ini satu contoh , dan satu lagi contoh .
Teknik apa yang bisa saya gunakan untuk mengimplementasikan ini?
Saya mencoba membuat efek berkilauan untuk shader waktu nyata saya, tetapi saya tidak tahu caranya.
Ini satu contoh , dan satu lagi contoh .
Teknik apa yang bisa saya gunakan untuk mengimplementasikan ini?
Jawaban:
Nah, ketika diminta untuk merancang shader apa pun, kita harus mulai dengan memecah masalah menjadi masalah yang lebih kecil. Dan seperti halnya efek kilau tidak benar-benar membuat shader terlihat bagus, tetapi keseluruhan pencahayaan dan efek, hanya menggunakan salah satu dari mereka tidak akan terlihat baik.
Pertama-tama, mari kita nyatakan apa yang bukan bagian langsung dari shader:
Kedua, mari pisahkan shader yang sebenarnya menjadi efek terpisah:
Perhatikan bahwa kain seperti itu memiliki banyak normalnya yang tak terhingga, tetapi teknik yang dijelaskan di sini mendekati normal yang paling signifikan
Dalam rangka untuk mendekati yang paling signifikan normal, salah satu cara yang harus dilakukan, adalah dengan menggunakan tekstur koordinat dan garis singgung menghitung mesh, dan bukannya menghitung N . L Anda menghitung 1- (NT).
Penjelasan lengkap di sini . Dan Anda mungkin perlu menerapkannya dalam fragmen shader daripada teknik vertex yang mereka bicarakan. Model anisotropik lainnya juga dapat diterapkan.
Sekarang untuk efek kilau:
Ini dapat dilakukan di ruang dunia / ruang tekstur lokal, atau ruang layar sebagai operan terpisah.
Algoritma yang dapat saya pikirkan, menggunakan teknik pemrosesan gambar (dengan asumsi mesh memiliki coords tekstur).
Perhatikan gambar di atas hanyalah contoh dari filter maks, dan menerapkannya pada noise akan memberikan sth mirip dengan bidang bintang.
Contoh filter Gausian diterapkan pada noise maks.
Catatan, teknik ini mungkin perlu optimisasi yang signifikan untuk shader waktu nyata.
Ada artikel yang menarik AMD - Getting Procedural .
Sepertinya kilau lebih sulit dari yang kupikirkan.
Solusi yang layak: Gunakan posisi 3D untuk mengindeks fungsi noise 3D, tambahkan vektor tampilan, gunakan fungsi frac untuk mengacak lebih jauh hal-hal.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);