Shader Plastik HLSL Tembus

12

Saya mencoba menghasilkan shader untuk mereplikasi objek plastik putih dengan cahaya berwarna di dalamnya. Entah dengan memiliki shader yang akan tembus cahaya dan jika saya menaruh cahaya di dalam objek cahaya akan menunjukkan melalui atau dengan memiliki shader yang memalsukan efek cahaya di dalamnya.

Efek yang saya dapatkan agak mirip dengan cahaya yang melewati kap lampu mirip dengan gambar-gambar ini:

teks alternatif teks alternatif teks alternatif

Idealnya saya bisa mengendalikan kekuatan dan warna cahaya untuk membuatnya berdenyut dan memutar melalui beberapa warna fluro cerah yang bagus

Meskipun saya tidak yakin harus mulai dari mana!

Pertanyaan saya adalah apakah ada yang tahu teknik yang harus saya teliti untuk dapat menghasilkan shader seperti itu atau memiliki contoh shader yang sama / mirip yang dapat saya gunakan sebagai titik awal? Atau bahkan jika Anda ingin memberikan shader yang mungkin melakukan pekerjaan itu

Tristan
sumber

Jawaban:

10

Ini adalah efek yang dikenal sebagai "Penyebaran Permukaan."

Ada contoh implementasi ruang layar ini dalam buku "GPU Pro: Teknik Rendering Tingkat Lanjut" yang cocok untuk penggunaan waktu nyata.

Tony McCrary
sumber
0

Saya tidak tahu HLSL jadi saya tidak bisa memberikan jawaban yang pasti. Apa yang pada dasarnya Anda dapat lakukan adalah mengatur warna setiap fragmen tergantung pada jarak dari sumber cahaya (mengabaikan bayangan diri).

Dalam pseudocode akan menjadi seperti ini:

fragment_color = light_intensity * transparansi_color * lightsource_color / (redaman * distance_to_lightsource ^ 2)

Anda mungkin juga ingin menggunakan faktor pelemahan linier selain kuadrat untuk mendapatkan cahaya menyebar lebih banyak.

Danik
sumber
0

Apakah cahaya perlu dapat bergerak, dan apakah objek tersebut harus dapat merusak / menghidupkan? Jika tidak satu pun dari kasus ini, cara murah untuk melakukan ini adalah dengan menerapkan peta tekstur monokrom pada objek yang bertindak sebagai topeng untuk cahaya; di shader Anda akan mencicipi tekstur ini, kalikan dengan warna / kekuatan cahaya saat ini dan tambahkan ke warna output.

Pertanyaan tindak lanjut yang jelas adalah bagaimana Anda menghasilkan tekstur ini? Anda dapat mencoba melukisnya, jika Anda memiliki akses ke artis atau dapat melukis sendiri teksturnya. Itu juga bisa diberikan oleh alat offline menggunakan raytracing atau semacamnya. Saya tidak cukup akrab dengan alat raytracing untuk memberi tahu Anda secara detail cara mengaturnya.

Pendekatan yang berbeda mungkin dengan menulis shader yang mengambil sampel cahaya di belakangnya, menggunakan permukaan terbalik normal dalam persamaan naungan difusi Lambert biasa; maka Anda akan mengalikannya dengan beberapa faktor topeng seperti 0,5 atau lebih dan menambah warna output. Ini akan memungkinkan secara dinamis memindahkan cahaya atau geometri, dan tidak memerlukan tekstur, tetapi Anda mungkin tidak akan mendapatkan hasil yang sama bagusnya dengan render offline.

Mengenai hamburan bawah permukaan: Saya tidak berpikir itulah yang diinginkan di sini karena semua algoritma SSS untuk grafis yang saya lihat dirancang untuk cahaya yang berasal dari luar permukaan, memantul sedikit dan keluar lagi, sementara di sini cahaya ada di dalam .

Nathan Reed
sumber