Dasar-dasar Harmonik Bulat
Spherical Harmonics adalah cara untuk merepresentasikan fungsi 2D pada permukaan bola. Alih-alih domain spasial (seperti cubemap), SH didefinisikan dalam domain frekuensi dengan beberapa properti menarik dan operasi yang relevan dengan pencahayaan yang dapat dilakukan secara efisien. Dengan meningkatnya "urutan" SH, Anda dapat mewakili frekuensi (detail) fungsi yang lebih tinggi seperti yang diilustrasikan dalam gambar di bawah ini ( adalah urutan SH). Dengan menskalakan dan menjumlahkan "fungsi dasar" di bawah ini, Anda dapat mewakili segala jenis fungsi 2D pada lingkup hingga frekuensi yang ditentukan oleh fungsi. Fungsi dasar didefinisikan dengan " polinomial Legendre terkait ", tetapi biasanya Anda tidak perlu membuatnya sendiri tetapi dapat menggunakan derivasi yang ada untuk harmonik bola sungguhan .
l
Salah satu operasi yang dapat dilakukan secara efisien di SH disebut " konvolusi ", yang berarti mengintegrasikan produk dari dua fungsi 2D bola di bola. Ini adalah operasi yang umum dalam perhitungan pencahayaan, mis. Salah satu fungsi bisa menjadi pencahayaan insiden Anda dan satu fungsi BRDF. Ketika direpresentasikan sebagai SH, operasi ini hanyalah produk titik dari dua vektor koefisien SH.
Operasi lain yang menarik adalah kemampuan untuk melakukan penyaringan low-pass yang efisien. Karena SH diwakili dalam domain frekuensi, ini hanyalah masalah penskalaan atau nolkan beberapa koefisien SH. Beberapa operasi lain di sisi lain bisa sulit untuk dilakukan di SH dibandingkan dengan domain spasial, misalnya jika Anda ingin memutar fungsi direpresentasikan sebagai SH, itu bisa menjadi cukup mahal untuk SH pesanan yang lebih tinggi. Jadi itu sangat tergantung pada masalah apakah itu cocok untuk dilakukan di SH atau tidak.
SH umumnya digunakan untuk mewakili hanya fungsi frekuensi rendah (yaitu fungsi yang berubah dengan lancar) karena frekuensi yang lebih tinggi memerlukan peningkatan jumlah penyimpanan (koefisien SH) dan pemrosesan. Inilah sebabnya mengapa Anda tidak melihat SH digunakan misalnya untuk mengganti pantulan specular pada permukaan mengkilap. Ada juga Zonal Spherical Harmonics , yang dapat digunakan untuk mengurangi penyimpanan & komputasi untuk fungsi 2D yang simetris secara rotasi tentang sumbu-z, dengan hanya menyimpan elemen diagonal dari matriks koefisien SH. Juga Hemispherical Harmonics dapat digunakan jika Anda hanya perlu berurusan dengan fungsi hemispherical (juga umum dalam pencahayaan) dengan keuntungan dapat mewakili frekuensi yang sama seperti SH dengan koefisien yang lebih sedikit.
Satu operasi yang juga perlu Anda lakukan adalah "proyeksi SH" untuk mengubah data domain spasial menjadi SH. Anda dapat melakukan operasi ini dengan melakukan konvolusi data domain spasial dengan fungsi berbasis SH. Properti SH yang menarik adalah bahwa tidak seperti representasi domain spasial, SH tidak menderita aliasing, jadi Anda tidak memiliki artefak aliasing bahkan ketika memproyeksikan ke SH dengan pesanan sangat rendah.
Probe ringan
Sekarang setelah Anda memahami operasi dasar dan properti SH, kami dapat memikirkan cara menerapkannya pada GI. Probe cahaya merekam berapa banyak cahaya yang datang dari setiap arah ke titik di mana probe berada. Ini adalah fungsi 2D pada bola dan dapat direpresentasikan sebagai SH (atau 3 fungsi SH untuk merah, hijau dan biru). Bergantung pada jumlah detail pencahayaan yang ingin kita enkode ke dalam probe, kita dapat memilih urutan SH.
Untuk probe cahaya yang hanya digunakan untuk pencahayaan difus Lambertian, SH dengan orde rendah cukup karena konvolusi dilakukan dengan cosine-lobe, yang dapat direpresentasikan dengan orde-2 SH (9 koefisien). Koefisien SH untuk probe cahaya dapat dihasilkan hanya dengan merender cubemap pada titik probe dan kemudian memproyeksikannya ke SH.
Saat merender geometri, beberapa probe cahaya terdekat diambil dan hasilnya diinterpolasi untuk mendapatkan fungsi pencahayaan insiden di suatu titik di ruang angkasa. Hal ini dapat dilakukan misalnya dengan menginterpolasi koefisien SH dari probe terdekat secara langsung dan kemudian melakukan konvolusi dengan pixel normal cosine lobe yang berorientasi pada domain SH.
Harmonik bola
Jika Anda tahu apa itu transformasi Fourier, Anda sudah hampir tahu apa itu harmonik bola: mereka hanya transformasi Fourier tetapi pada bola bukannya basis linear. Yaitu, sementara transformasi Fourier adalah cara berbeda untuk mewakili fungsi , harmonik bola adalah hal yang analog dengan fungsi kutub .f ( θ , ϕ )f(x) f(θ,ϕ)
Jika Anda tidak tahu apa itu transformasi Fourier, Anda perlu tahu sebelum Anda dapat memahami harmonik bola. Transformasi Fourier memungkinkan Anda menghadirkan sinyal sebagai serangkaian gelombang sinus dan kosinus, masing-masing dengan frekuensi dua kali lipat dari yang terakhir. Artinya, Anda dapat mewakili sinyal sebagai rata-rata, ditambah gelombang sinus yang panjang gelombangnya sama dengan panjang sinyal, ditambah gelombang sinus dua kali panjang gelombang itu, dan seterusnya. Karena transformasi Fourier membuat Anda sesuai dengan panjang gelombang ini, Anda hanya perlu merekam amplitudo masing-masing.
Kami biasanya menggunakan transformasi Fourier untuk mewakili gambar, yang hanya merupakan sinyal digital 2D. Ini berguna karena Anda dapat membuang beberapa gelombang sinus (atau mengurangi presisi yang digunakan untuk menyimpan amplitudo mereka) tanpa secara signifikan mengubah seperti apa gambar itu bagi mata manusia. OTOH, membuang piksel mengubah banyak gambar.
Dalam sinyal sampel seperti gambar, jika Anda menggunakan jumlah gelombang sinus yang sama dengan sampel (piksel) dalam gambar asli, Anda dapat merekonstruksi gambar dengan tepat, jadi setelah Anda mulai membuang frekuensi apa pun, Anda membuat gambar mengambil lebih sedikit penyimpanan.
Harmonik bola seperti transformasi Fourier, tetapi alih-alih gelombang sinus, mereka menggunakan fungsi bola, jadi alih-alih fungsi linear (seperti gambar), mereka dapat mewakili fungsi yang didefinisikan pada bola (seperti peta lingkungan).
Probe cahaya
Seperti halnya gambar standar merekam semua cahaya yang mencapai titik tertentu melalui bidang gambar, probe cahaya merekam semua cahaya yang mencapai titik tertentu dari segala arah. Mereka pertama kali keluar dari efek film. Jika Anda ingin menambahkan objek yang dihasilkan komputer ke adegan dunia nyata, Anda harus dapat menerangi objek sintetis dengan pencahayaan dunia nyata. Untuk melakukan itu, Anda perlu tahu cahaya apa yang mencapai titik di adegan di mana objek sintetis akan berada. (NB Meskipun saya mengatakan "pencahayaan", Anda sedang merekam gambar dari semua cahaya, sehingga dapat digunakan untuk refleksi juga.)
Karena Anda tidak dapat memiliki kamera dengan lensa bola yang merekam semua cahaya yang mencapai satu titik dari semua arah, Anda merekam ini dengan mengambil foto normal dari cermin bulat, dan kemudian memproyeksikan ulang gambar ke bola.
Di luar efek film, lebih umum menggunakan probe cahaya yang dihasilkan dari adegan buatan. Bayangkan Anda memiliki beberapa algoritma mahal untuk menghitung penerangan global (GI) dalam sebuah adegan, dan Anda juga memiliki beberapa objek yang lebih kecil bergerak dalam adegan ini (seperti tingkat permainan dengan pemain di dalamnya). Anda tidak dapat menjalankan keseluruhan algoritma GI setiap kali objek bergerak, jadi Anda menjalankannya sekali dengan adegan statis, dan menyimpan probe cahaya yang diambil di berbagai titik di level. Kemudian Anda bisa mendapatkan perkiraan yang baik untuk GI dengan menyalakan pemain dengan probe cahaya mana pun yang paling dekat dengannya.
Menggunakannya bersama
Secara umum Anda ingin menyaring sisi tajam dalam pencahayaan global Anda, jadi Anda ingin cara untuk mewakili mereka yang ringkas dan mudah memungkinkan Anda membuang frekuensi tinggi. Itulah yang benar-benar bagus dalam harmonik bola! Itu sebabnya Anda akan sering mendengar dua istilah ini digunakan bersama.
Anda menghitung probe cahaya dengan algoritma GI mahal Anda - biasanya di alat desain level, atau mungkin sekali per detik (bukan sekali per frame) jika Anda ingin menyertakan objek dinamis Anda. Anda menyimpan yang murah dengan harmonik bola - 16 pelampung cukup untuk penerangan berkualitas tinggi, tetapi bukan pantulan. Kemudian untuk setiap objek dinamis yang ingin Anda nyalakan, Anda memilih probe cahaya terdekat (atau menyatukan beberapa objek secara linear) dan menggunakannya sebagai input seragam atau konstan ke shader Anda. Ini juga biasa untuk menggunakan harmonik bola untuk mewakili data oklusi ambien, dan itu sangat murah untuk berbelit-belit dengan probe cahaya, meskipun ada beberapa kompleksitas di sekitar memutar fungsi harmonik bola.
sumber
Harmonik bola
Katakanlah Anda memiliki beberapa data dalam sebuah array tetapi Anda ingin merepresentasikan data itu dengan jumlah byte yang lebih sedikit.
Salah satu cara untuk melakukan itu bisa dengan mengekspresikan data sebagai fungsi, bukan nilai mentah.
Anda bisa menggambarkannya sebagai fungsi linear:y=ax+b
Maka alih-alih menyimpan array nilai Anda, Anda bisa menyimpan hanya dan .ba b
Masalahnya adalah, persamaan linear mungkin merupakan perkiraan yang buruk untuk data Anda.
Anda bisa mencoba kuadratik sebagai gantinya:y=ax2+bx+c
Sekarang alih-alih menyimpan dan , Anda menyimpan , dan .b a b ca b a b c
Kami telah meningkatkan penyimpanan memori dan juga kompleksitas komputasi untuk menyimpan dan mengambil data Anda, dibandingkan dengan persamaan linear, tetapi ini adalah perkiraan yang lebih baik untuk array data Anda. Kita juga bisa membawanya ke fungsi kubik atau lebih tinggi. Meningkatkan urutan meningkatkan penyimpanan, perhitungan dan akurasi.
Harmonik bola adalah cara membuat fungsi yang didefinisikan pada bola bukannya seperti yang saya bicarakan di atas.f(x)
Sama seperti pada contoh di atas, Anda dapat menggunakan fungsi harmonik bola orde rendah untuk membuat sesuatu dengan penyimpanan lebih rendah, dan komputasi lebih rendah untuk menghitung data, tetapi juga akurasi lebih rendah.
Di sisi lain, Anda dapat meningkatkan urutan dan mendapatkan perkiraan yang lebih baik untuk data asli Anda, tetapi dengan biaya lebih banyak ruang penyimpanan yang dibutuhkan, dan lebih banyak perhitungan yang diperlukan untuk menghitung suatu titik data.
Secara ekstrim, Anda dapat menggunakan sebanyak mungkin istilah harmonik bola seperti yang Anda punya sampel dalam array Anda, dan kemudian Anda dapat merekonstruksi array asli Anda dengan tepat, tetapi Anda menghabiskan banyak perhitungan melakukan hal itu, dan Anda menggunakan ruang penyimpanan yang sama banyaknya saat Anda mulai.
Karena itu, dalam praktiknya, fungsi harmonik bola tidak menawarkan banyak manfaat jika Anda perlu merepresentasikan detail halus - seperti pantulan tajam pada sebuah bola - tetapi bisa murah untuk data yang tidak memiliki detail halus (data yang tidak memiliki banyak konten frekuensi tinggi). Mereka juga berguna untuk melakukan perhitungan domain frekuensi seperti analisis spektral atau konvolusi.
Salah satu data seperti itu mereka pandai menyimpan adalah "radiasi" yang merupakan jumlah cahaya yang mengenai suatu titik dari arah lain. Itu cenderung terlihat agak buram, yang berarti hanya memiliki konten frekuensi rendah, dan merupakan kandidat yang baik untuk disimpan dalam fungsi harmonik bola.
Saya akan meninggalkan penjelasan probe cahaya kepada orang lain: hal
sumber