Dalam OpenGL (dan sistem lainnya) faktor redaman jarak untuk lampu titik adalah sesuatu seperti 1/(c+kd+sd^2)
, di mana d
jarak dari cahaya dan c
, k
dan s
merupakan konstanta.
Saya memahami sd^2
komponen yang memodelkan pelemahan "hukum kuadrat terbalik" yang terkenal secara fisik yang diharapkan dalam kenyataan.
Saya kira konstan c
, biasanya satu, apakah ada untuk berurusan dengan nilai-nilai yang sangat kecil d
(dan pertahanan bagi-oleh-nol mungkin?).
Apa peran kd
komponen linear dalam model, (secara default k
adalah nol di OpenGL). Kapan Anda akan menggunakan nilai-nilai lain k
? Saya tahu bahwa ini disebut komponen "pelemahan linear", tetapi perilaku apa yang disimulasikan dalam model pencahayaan? Tampaknya tidak muncul dalam model fisik cahaya apa pun yang saya sadari.
[EDIT]
Telah dikemukakan oleh David Gouveia bahwa faktor linier dapat digunakan untuk membantu membuat adegan 'melihat' lebih dekat dengan apa yang pengembang / artis maksudkan, atau untuk lebih mengontrol laju penurunan cahaya. Dalam hal ini pertanyaan saya menjadi "apakah faktor pelemahan linier memiliki rekanan fisika atau hanya digunakan sebagai faktor fudge untuk membantu mengontrol kualitas cahaya di tempat kejadian?"
Jawaban:
Cahaya, dari sumber seperti titik, jatuh dengan kuadrat jarak. Itu realitas fisik.
Redaman linear sering dinyatakan tampil superior. Tapi ini hanya berlaku ketika bekerja di ruang warna non-linear . Yaitu, jika Anda tidak memiliki koreksi gamma yang tepat aktif. Alasannya cukup sederhana.
Jika Anda menulis nilai RGB linier ke tampilan non-linier tanpa koreksi gamma, maka nilai linier Anda akan hancur oleh jalan gamma bawaan monitor. Ini secara efektif menggelapkan pemandangan dibandingkan dengan apa yang Anda inginkan.
Dengan asumsi gamma 2.2, monitor Anda akan secara efektif menaikkan semua warna ke kekuatan 2.2 saat menampilkannya.
Ini adalah atenuasi linear:
1/kd
. Ini adalah linear pelemahan dengan monitor jalan gamma diterapkan:1/(kd)^2.2
. Itu cukup dekat dengan hubungan terbalik-kuadrat yang tepat.Tapi kebalikan aktual kuadrat:
1/sd^2
menjadi:1/((s^2)(d^4.4))
. Ini membuat redaman cahaya jatuh jauh lebih tajam dari yang diperkirakan.Secara umum, jika Anda menggunakan koreksi gamma yang tepat (seperti merender ke framebuffer sRGB), Anda tidak boleh menggunakan atenuasi linier. Itu tidak akan terlihat benar. Sama sekali . Dan jika Anda tidak menggunakan koreksi gamma ... apa yang salah dengan Anda;)
Bagaimanapun, jika Anda mencoba untuk meniru kenyataan, Anda ingin kuadrat terbalik (dan gamma benar). Jika tidak, maka Anda dapat melakukan apa pun yang diperlukan untuk adegan Anda.
sumber
Fleksibilitas .
Karena Anda mungkin ingin lampu Anda jatuh secara linear. Itu ada di sana untuk memberi Anda tingkat kontrol itu. Itu tidak benar-benar harus akurat secara fisik (dan seluruh persamaan pencahayaan phong shading juga tidak akurat secara fisik).
Terkadang model kuadratik akan mengeluarkan cahaya terlalu cepat di dekat sumber dan meninggalkan "silau putih" pada permukaan di dekatnya. Dengan memberikan koefisien linier dan konstan, Anda memiliki fleksibilitas untuk menyesuaikan hasil sesuai keinginan Anda
Misalnya, ketika saya menerapkan raytracer, saya menemukan bahwa hukum kuadrat terbalik membuat lampu titik saya jatuh terlalu cepat. Saya berubah menjadi model linear yang dijepit (di mana setiap cahaya memiliki radius minimum dan maksimum, dengan interpolasi linier di antaranya) dan itu hanya terlihat lebih baik.
Sunting: Baru saja menemukan sumber yang bagus untuk menjelaskan hal ini .
sumber
Oke, saya akan menebaknya.
Pengamatan awal
Kurva untuk
c+kd+sd^2
adalah parabola, dan demikian pula kurva untuksd^2
; perbedaannya tidak sepenting kelihatannya: mereka berperilaku sama pada saat tak terbatas, hanya saja untuk nilai-nilai kecil mereka berbeda. Apa punk
artinya, itu hanya bermakna ketika dekat dengan cahaya.Penyederhanaan awal
Karena ini adalah faktor pelemahan yang bisa Anda atur juga
s == 1
, atau bagi setiap konstanta dengans
ekspresi, dan bagi kekuatan sumber cahaya Andas
. Ada satu parameter yang terlalu banyak dalam rumus.Anda berakhir dengan:
Perubahan variabel
... yang setara dengan:
dengan
A == c/s - k^2/(4s^2)
dan, yang lebih pentingD == d + k/2s
,.Ini
1/(A+D^2)
benar-benar terlihat seperti biasanya1/(c+d^2)
, bukan?Kesimpulan
The
k
Faktor kemajuan atau penundaan redaman cahaya sehingga hanya dimulai pada radius-k/2s
(ya, itu juga bisa memiliki "negatif" radius, memikirkan sebuah titik cahaya imajiner di dalam sebuah cermin bulat imajiner yang hanya akan membiarkan cahaya keluar kedua kalinya) . Tampaknya matematika menang lagi!Sunting: Untuk sesaat saya pikir itu setara dengan cahaya bulat, tapi ternyata tidak. Terutama, itu tidak akan menghasilkan bayangan lembut.
Kegunaan?
Dugaan saya adalah bahwa parameter ini dapat digunakan oleh seorang seniman untuk membuat cahaya tampak seperti lebih dekat (atau lebih jauh) ke objek dalam hal penerangan, tetapi tanpa memindahkannya. Karena lampu titik menghasilkan bayangan keras, mungkin persyaratan bahwa cahaya tetap pada posisi tertentu.
sumber
Koefisien atenuasi linier adalah pasangan fisik cahaya yang bepergian ke media. Tanpa redaman, cahaya seolah berjalan dalam kehampaan sempurna. Saat merender adegan "realistis", Anda ingin udara menipiskan intensitas cahaya dari jarak jauh, dan pelemahan ini linear.
sumber
1/d
diR
koordinat, dan masih oleh1/d^2
ditheta
danphi
koordinat bola. Karena itu apa yang Anda gambarkan adalah1/d^3
pelemahan dari intensitas cahaya.Faktor pelemahan linier ada untuk kasus di mana Anda mungkin ingin menggunakan pelemahan linier untuk pencahayaan Anda, tetapi kuncinya adalah - Anda tidak harus menggunakannya (atau faktor pelemahan lainnya, dalam hal ini).
Ini memungkinkan Anda menyesuaikan pencahayaan dengan selera pribadi Anda. Jadi tetapkan saja faktor pelemahan yang tidak Anda inginkan 0 dan yang Anda inginkan bukan-0 dan selesai.
Salah satu contoh spesifik di mana Anda mungkin ingin menggunakan redaman linear adalah jika invers-square yang lebih matematis memberikan terlalu cepat jatuh. Menggunakan linear Anda bisa mendapatkan hasil yang bisa terlihat lebih atau kurang cukup baik (dan dengan lebih sedikit lampu di TKP); jadi Anda akan menggunakan 0 konstan, 1 linear dan 0 eksponensial.
Sangat menarik untuk dicatat (tetapi diakui tidak relevan dengan diskusi ini) bahwa sprite titik di OpenGL dan D3D (dan parameter titik di OpenGL) menggunakan rumus pelemahan yang sama.
Juga perlu dicatat bahwa pencahayaan OpenGL / D3D tidak dimaksudkan untuk benar secara fisik; itu tidak pernah dirancang untuk menjadi lebih dari perkiraan yang dapat diterima, dan itu harus diingat ketika menanyakan sesuatu yang berkaitan dengan cara kerjanya.
Tentu saja, saat ini kemungkinan besar Anda akan menggunakan shader sehingga rumus cahaya lama hanya untuk kepentingan akademik / sejarah saja - Anda dapat menulis rumus cahaya apa pun yang Anda inginkan.
sumber
c
adalah nilai atenuasi konstan untuk sumber cahaya.l
adalah atenuasi linier. Itu sebabnya ini dikalikan dengan distante ke sumber cahaya.s
adalah atenuasi kuadratik, sehingga dikalikan dengan kuadrat jarak.Ada beberapa info lagi di tautan ini .
sumber
Mungkin berasal dari fakta bahwa Z, dalam kata - kata Eric Lengyel yang terhormat ,
Buffer kedalaman menyimpan jarak. Cahaya menggunakan jarak untuk redaman. Bisa jadi hubungan antara kedalaman penyangga dan implementasi pencahayaan yang mengharuskan ini, meskipun itu akan berlaku hanya jika algoritma pencahayaan berjalan di ruang layar saya kira. Ingatlah bahwa lebih baik untuk selalu menyimpan kebalikan yang diperkirakan (atau dihitung perangkat keras), daripada harus melakukan pembagian pada nilai yang tidak terbagi untuk setiap op per frame yang membutuhkannya ... dan itu cenderung merupakan jumlah op yang sangat besar.
Ini hanya dugaan saja.
sumber
Sama seperti tambahan: Saat menggunakan model openGL untuk memperkirakan sumber cahaya berbentuk bola, ketiga koefisien masuk akal dan valid (bukan "untuk mencegah luapan" atau untuk memiliki "kebebasan artistik"):
Untuk bola dengan jari-jari r kita dapatkan:
1 / (d / r + 1) ^ 2
ini diterjemahkan menjadi
c = 1 k = 2 / r s = (1 / r ^ 2)
(lihat http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).
Sepertinya pendekatan ini lebih baik daripada menggunakan lampu titik yang sangat kecil tanpa memanjang sama sekali!
sumber
Saya memiliki pandangan / jawaban yang berbeda tentang formula.
Ketika kita melihat cahaya spot, misalnya, sebenarnya kita melihat hamburan cahaya. Jadi rumus 1 / d ^ 2 hanya untuk cahaya memancarkan piksel itu. Tetapi kecerahan pada kamera kami dari piksel itu akan memiliki formula yang lebih rumit, yang akan menggunakan teori hamburan cahaya. Lihat kertasnya
"Pengambilan Sampel Epipolar untuk Bayangan dan Sinar Crepuscular di Media yang Berpartisipasi dengan Hamburan Tunggal"
oleh Thomas Engelhardt, Carsten Dachsbacher Namun sayangnya mereka tidak memiliki formula sederhana akhir untuk hamburan cahaya. Saya kira mungkin efek imitasi GPU akhir akan mirip dengan rumus linear dan kuadratik.
Jadi saya pikir klaimnya:
"Jika Anda mencoba untuk meniru kenyataan, Anda ingin kuadrat terbalik (dan gamma benar)" tidak valid.
Sebenarnya saya menggunakan rumus dengan faktor linier dan kuadratik tanpa gamma dapat meniru efek bercahaya dengan sangat baik. Linear tidak bisa.
Dalam ringkasan singkat, rumus memiliki mitra fisik hamburan cahaya.
sumber