Apakah komponen atenuasi linier dalam model pencahayaan memiliki pasangan fisik?

18

Dalam OpenGL (dan sistem lainnya) faktor redaman jarak untuk lampu titik adalah sesuatu seperti 1/(c+kd+sd^2), di mana djarak dari cahaya dan c, kdan smerupakan konstanta.

Saya memahami sd^2komponen 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 kdkomponen linear dalam model, (secara default kadalah 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?"

Ken
sumber
Saya tidak mengatakan bahwa pelemahan linear membuat pemandangan terlihat lebih baik atau lebih realistis. Apa yang saya katakan adalah bahwa itu mungkin terlihat lebih baik untuk tujuan Anda . Raytracer saya menerangi pemandangan yang sangat kecil, dan ketika membandingkan kedua model, linier tampak lebih baik. Saya tidak perlu alasan fisik untuk mengatakan itu terlihat lebih baik - itu hanya melihat lebih dekat dengan efek yang ingin saya capai. Sebaliknya, bukan bahwa hukum kuadrat terbalik tidak terlihat realistis, hanya jatuh terlalu cepat dan memberikan kontribusi lebih sedikit pada pencahayaan pemandangan daripada yang saya butuhkan.
David Gouveia
Maaf David, saya tidak bermaksud salah menggambarkan jawaban Anda. Saya telah mengubah hasil edit saya di atas.
Ken
1
Selalu baik untuk diingat bahwa semua pencahayaan adalah retasan, murni dan sederhana =)
Patrick Hughes

Jawaban:

21

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^2menjadi: 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.

Nicol Bolas
sumber
4
+1 Saya sudah tahu tentang rendering gamma yang benar untuk sementara waktu. Saya sudah tahu tentang atenuasi kuadratik dan linier untuk sementara waktu. Dan inilah saat dimana saya pertama kali menyadari hubungan antara keduanya. :-)
David Gouveia
Ada alasan untuk -1?
Nicol Bolas
9

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 .

David Gouveia
sumber
6

Oke, saya akan menebaknya.

Pengamatan awal

Dalam OpenGL (dan sistem lainnya) faktor redaman jarak untuk lampu titik adalah sesuatu seperti 1/(c+kd+sd^2), di mana djarak dari cahaya dan c, kdan smerupakan konstanta.

Saya memahami sd^2komponen yang memodelkan pelemahan "hukum kuadrat terbalik" yang terkenal secara fisik yang diharapkan dalam kenyataan.

Kurva untuk c+kd+sd^2adalah parabola, dan demikian pula kurva untuk sd^2; perbedaannya tidak sepenting kelihatannya: mereka berperilaku sama pada saat tak terbatas, hanya saja untuk nilai-nilai kecil mereka berbeda. Apa pun kartinya, 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 dengan sekspresi, dan bagi kekuatan sumber cahaya Anda s. Ada satu parameter yang terlalu banyak dalam rumus.

Anda berakhir dengan:

1/(c/s+(k/s)d+d^2)

Perubahan variabel

... yang setara dengan:

1/(A + D^2)

dengan A == c/s - k^2/(4s^2)dan, yang lebih penting D == d + k/2s,.

Ini 1/(A+D^2)benar-benar terlihat seperti biasanya 1/(c+d^2), bukan?

Kesimpulan

The kFaktor 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.

sam hocevar
sumber
3

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.

Ravachol
sumber
Saya pikir itu tidak benar. Perjalanan cahaya melalui media akan dilemahkan oleh 1/ddi Rkoordinat, dan masih oleh 1/d^2di thetadan phikoordinat bola. Karena itu apa yang Anda gambarkan adalah 1/d^3pelemahan dari intensitas cahaya.
sam hocevar
3

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.

Maximus Minimus
sumber
1
  • c adalah nilai atenuasi konstan untuk sumber cahaya.
  • ladalah 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 .

r2d2rigo
sumber
Terima kasih, tapi pertanyaan saya adalah apa peran komponen redaman linear dalam pemodelan cahaya. Saya bertanya karena tidak muncul dalam model cahaya fisika apa pun yang saya sadari. Tautan yang Anda berikan TIDAK menjelaskan untuk apa komponen redaman linear itu. Itu hanya mengatakan; "Ini adalah pelemahan linear", tanpa penjelasan lain.
Ken
Oke, saya salah mengartikan pertanyaan Anda. Atenuasi linier akan lebih baik diamati dalam sumber cahaya satu dimensi yang tak terbatas (pikirkan tabung fluoresen), sementara model kuadrat memodelkan perilaku sumber cahaya bola. Sejauh ini saya hanya menemukan satu tempat di mana ada penjelasan tentang korespondensi antara model cahaya fisik dan yang digunakan dalam grafis komputer: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo
1

Mungkin berasal dari fakta bahwa Z, dalam kata - kata Eric Lengyel yang terhormat ,

bersifat nonlinear karena rasterisasi dengan perspektif yang benar membutuhkan interpolasi linier 1 / z - interpolasi linier z itu sendiri tidak menghasilkan hasil yang benar. Perangkat keras harus menghitung 1 / z pada setiap titik dan menyisipkannya melintasi segitiga, jadi lebih mudah untuk hanya menulis nilai itu ke buffer kedalaman daripada melakukan pembagian mahal pada setiap piksel untuk memulihkan z.

Fakta bahwa Anda mendapatkan ketepatan z lebih dekat dengan bidang dekat hanyalah efek samping dan tidak ada hubungannya dengan motivasi di balik interpolasi 1 / z.

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.

Insinyur
sumber
Anda mungkin menemukan sesuatu di sana. Mungkin ada hubungannya dengan ruang di mana pencahayaan dihitung. Tapi saya tidak berpikir buffer kedalaman adalah bagian dari itu, karena menyimpan 'jarak semu' dari mata (atau bidang depan) ke objek, bukan jarak dari cahaya ke objek. Jarak cahaya yang digunakan dalam pencahayaan.
Ken
@ downvoter - peduli mengomentari, atau hanya sekedar trolling? (mengutip Jonathan)
Insinyur
Menundukkan juga, pelemahan dihitung dalam ruang mata bukan ruang dinormalisasi -> perspektif / z tidak ada hubungannya dengan ini
Oliver Zendel
1

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!

Oliver Zendel
sumber
Bagaimana rumus 1 / (d / r + 1) ^ 2 datang? Artikel asli hanya mengatakan "Setelah melihat hasil dari serangkaian tes, menjadi jelas", yang tidak cukup meyakinkan dalam hal pertanyaannya adalah bertanya tentang pemodelan fisik.
user1914692
0

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.

pengguna1914692
sumber