Bagaimana mendapatkan cahaya yang mengubah warna di tengah jalan?

11

Saya berpikir untuk membuat sumber cahaya, dan beberapa jendela berwarna. Sekarang, windows semi-transparan. Bagaimana saya bisa membuatnya sehingga ketika cahaya (katakanlah, putih bersih) mengenai gelas dan terus melewatinya, tetapi mengubah warnanya menjadi warna yang sama dengan gelas yang dilewatinya?

Saya tahu efek yang dijelaskan di sini dapat dipalsukan dengan menggunakan lampu area pada sisi "berwarna" jendela, tetapi bagaimana jika saya hanya ingin memiliki satu titik cahaya putih?

manabreak
sumber
Alih-alih mengubah warna cahayanya, dapatkah Anda mengubah warna dasar benda-benda yang menyala di sisi lain kaca? mungkin itu akan berhasil?
HumanCatfood
Jendela transparan diberikan sebagai lintasan kedua, shader-nya hanya mengubah keseimbangan warna dari setiap output piksel. Apakah ini tidak akan berhasil?
Patrick Hughes
Menurut saya ini analog dengan masalah bayangan; jika Anda memiliki algoritme yang bagus untuk bayangan yang dibuat oleh objek semi-transparan (saya tidak tahu apakah itu praktis), maka Anda hanya perlu menjalankannya untuk tiga saluran warna paralel.
Kevin Reid

Jawaban:

14

Ada banyak cara untuk melakukan ini. Ini akan membutuhkan penggunaan shader dan saya berasumsi bahwa Anda sudah melakukan pencahayaan per-pixel. Berikut ini adalah beberapa saran, namun menemukan teknik yang tepat untuk Anda mungkin memerlukan lebih banyak penelitian.

Cepat dan kotor

Anda dapat menentukan kotak pembatas yang menentukan area interior. Jika cahaya berada di luar kotak, tetapi geometri (yang tidak dalam bayangan) ada di dalam kotak, maka cahaya pasti terpengaruh dengan melewati jendela (ini juga berlaku jika geometri berada di luar kotak dan cahaya di dalam). Satu-satunya masalah di sini adalah bagaimana meneruskan informasi kotak ke shader dan bagaimana menyatakan efeknya pada cahaya.

Pilihan lain adalah menentukan windows sebagai objek yang diletakkan di pesawat. Tes pertama untuk melihat apakah geometri dan cahaya berada di sisi yang berlawanan dari pesawat dan kemudian jika cara di antara mereka memotong pesawat pada titik di dalam batas-batas jendela. Ini akan lebih akurat daripada metode pertama dan akan lebih mudah untuk memiliki jendela ke interior yang sama dengan warna kaca yang berbeda.

Terus semakin detail dengan representasi geometris windows dan Anda akan mendapatkan hasil yang lebih akurat, tetapi perhitungannya juga akan semakin berat.

Teknik-teknik ini akan bekerja cukup baik untuk penembak koridor, tetapi tidak begitu baik untuk dunia yang dinamis atau terbuka karena banyak penyesuaian mungkin diperlukan untuk membuatnya terlihat benar tanpa terlalu banyak artefak. Juga, teknik-teknik ini dapat dengan cepat menjadi sedikit intens, sehingga pindah ke pipa peneduh yang ditangguhkan akan disarankan.

Peta Bayangan

Pilihan lain adalah melakukan sesuatu yang mirip dengan pemetaan bayangan.

Dalam pemetaan bayangan Anda menghasilkan beberapa gambar bitmap dari dunia yang dipengaruhi oleh cahaya. Setiap piksel, meski masih berwarna, sebenarnya adalah jarak potongan terdekat dari geometri non-transparan (Anda menggunakan empat byte untuk 1 float, bukan 4 warna). Jika Anda menghitung jarak dari cahaya ke sepotong geometri dan itu lebih jauh dari nilai yang sesuai di peta bayangan maka potongan geometri Anda dalam bayangan (Anda biasanya menggunakan sinar antara geometri dan cahaya untuk mengindeks peta).

Jika Anda menerapkan ide ini untuk masalah Anda, maka apa yang akan Anda lakukan adalah menyimpan peta jarak dari cahaya bagian terdekat dari geometri transparan, dan kemudian juga membuat peta kedua warna cahaya setelah melewati geometri itu ( cukup warna geometri jika cahayanya putih).

Jika potongan geometri Anda lebih jauh dari jarak di peta ini, maka gunakan warna peta, jika tidak maka gunakan warna cahaya asli.

Fungsi untuk menghitung warna untuk setiap piksel dalam peta seharusnya kira-kira; lightColor - terbalikWindowColor. Jadi untuk cahaya putih murni dan jendela merah murni yang tidak menyerap spektrum merah yang kita dapatkan; (255.255.255) - (0,255.255) = (255,0,0). Jadi warna cahaya di sisi lain adalah merah murni. Untuk objek transparan yang lebih kompleks, seperti jendela kaca patri, Anda mungkin ingin memiliki tekstur untuk mendapatkan warna material.

Jika Anda mencari sesuatu yang serupa maka periksa Peta Shadow Reflektif .

Teknik ini menawarkan banyak kesetiaan dan mungkin yang terbaik jika Anda ingin menggunakan geometri transparan yang kompleks seperti jendela kaca patri.

Mencoba Solusi Umum

Baru-baru ini menjadi populer untuk menyandikan informasi pencahayaan dalam representasi voxel (mereka tidak hanya untuk geometri). Mesin crytek terbaru menggunakan jenis strategi ini untuk penerangan tingkat lanjut ( volume perambatan cahaya ).

Inilah ide umumnya:

  • Buat peta kubus dengan spasi merata yang mencakup adegan Anda (pertimbangkan untuk menggunakan kurva z-order ).
  • Temukan cara menyimpan informasi pencahayaan untuk setiap voxel (representasi harmonik bola berguna di sini).
  • Temukan voxel yang mengandung cahaya dan mewakili cahaya itu di voxel.
    • Menyebarkan cahaya keluar melalui voxels yang berdekatan (seperti air minecraft seperti)
    • Hitung bagaimana geometri di setiap voxel akan memengaruhi cahaya yang melewatinya (menyerap, memantulkan, mengirimkan)
    • ulangi sampai cahaya memudar

Ada banyak cara untuk membangun informasi voxel ini, tetapi daftar di atas memberikan gambaran umum. Sebagai contoh; Anda bisa mulai dengan membuat peta bayangan / volume dan kemudian memproyeksikan informasi itu ke dalam peta voxel sehingga Anda dapat dengan cepat membuat peta pencahayaan langsung. Kemudian Anda mulai propagasi dari voxel di sepanjang tepi area yang terpengaruh. Tetap di tambang bahwa, dalam hal ini, Anda akan ingin mengabaikan apakah geometri transparan atau tidak saat membuat peta bayangan / volume.

Pada langkah terakhir penyaji yang ditangguhkan, saat menghitung penerangan titik geometri, Anda cukup menggunakan posisi geometri untuk mengindeks peta voxel Anda untuk mengetahui seperti apa pencahayaan yang terjadi pada titik ruang tersebut. Kemudian Anda dapat membangun peta layar sisi cpu pencahayaan insiden, atau mungkin melakukan ini dengan cuda.

OriginalDaemon
sumber
Terima kasih untuk postingnya yang panjang! Saat ini saya sedang menyelidiki apakah saya akan melakukan render maju atau ditunda untuk proyek saat ini saya sedang mengerjakan. Saat ini mungkin akan ditangguhkan. Bagaimana yang akan Anda lakukan ketika jendelanya multi-warna (misalnya, kaca patri di gereja)?
manabreak
@manabreak - Saya akan menggunakan ekstensi bayangan peta karena akan menawarkan tingkat kesetiaan terbaik untuk kasus itu. Saya akan mengedit posting untuk menjelaskan ini.
OriginalDaemon
Terimakasih banyak! Posting ini benar-benar membuat hari saya, saya mungkin belum pernah melihat begitu banyak upaya dimasukkan ke dalam posting tunggal.
manabreak