Menangani Proyeksi Aliasing Dalam Pemetaan Bayangan

15

Saya mengutak-atik pemodelan 3D prosedural sederhana untuk membuat bangunan mungil untuk pencetakan 3D. Sebuah contoh:

Bangunan


Untuk membuat model lebih mudah dibaca di layar, saya telah menerapkan pemetaan bayangan dasar untuk satu arah cahaya. Karena adegan saya tidak berubah, saya hanya membuat peta bayangan sekali menggunakan kotak kotak yang disejajarkan adegan untuk mencari tahu apa batas-batas peta bayangan seharusnya. Bayangan dan batas tampak seperti saya sudah benar semua matriks, tetapi datang sedikit lebih dekat tampak mengerikan:

Closeup of Tower

Dari bacaan yang telah saya lakukan, saya memahami panning peter dan apa yang mungkin saya lakukan tentang hal itu, tetapi ujung-ujungnya yang kasar, yang saya yakini adalah bentuk aliasing projektif, terlihat sangat buruk sehingga saya pikir ada sesuatu yang salah dalam implementasi dasar saya.

Saya meretas pixel shader untuk menunjukkan batas bayangan texel:

Menampilkan Batas Texel

Saya memiliki bilinear filtering pada tekstur (tanpa itu, saya mendapatkan jerawat bayangan yang serius). Sedihnya, upaya saya di PCF juga gagal - sepertinya hanya compang-camping:

masukkan deskripsi gambar di sini

Inilah contoh kasus tunggal dengan pemfilteran bilinear dinonaktifkan:

masukkan deskripsi gambar di sini

Apakah ini terlihat seperti aliasing proyektif "khas"? Bisakah rendering dinamis dari peta bayangan, menggunakan frustrasi tampilan terpotong ke tempat kejadian, mungkin dengan cascading, mengatasi masalah ini?

Sunting: Menambahkan closeup pemfilteran bilinear, memposting perbandingan bayangan, hanya untuk menunjukkan apa yang saya dapatkan. Jerawat bayangan buruk muncul karena tepi interior; Saya memodelkan dengan blok virtual bertumpuk dan tidak melakukan operasi serikat yang tepat. Dari bacaan saya, menerapkan operasi boolean pada polyhedra bukanlah hal sepele, tetapi juga akan memungkinkan saya untuk menerapkan volume bayangan statis serta membersihkan beberapa perangkat lunak pencetakan 3D.

Penyaringan Bilinear

Daniel M Gessel
sumber

Jawaban:

10

Pemetaan bayangan dengan kualitas yang dapat diterima cukup sebuah perjalanan. Jadi Anda menerapkan langkah pertama - peta bayangan dasar yang mencakup seluruh adegan secara statis. Ini berarti bahwa ukuran bayangan peta texel dalam ruang tampilan cahaya ke ukuran texel adegan yang diberikan dalam rasio ruang tampilan kamera cukup besar, sehingga menghasilkan aliasing. Untuk mengurangi rasio ini lebih dekat ke 1: 1 ada teknik yang Anda sebutkan seperti:

  • cara termudah adalah meningkatkan ukuran peta bayangan Anda, untuk menemukan nilai dengan kinerja yang masih optimal,
  • menyelaraskan peta bayangan dengan frustum tampilan kamera. Kemudian bayangan peta mencakup bagian yang lebih kecil dari pemandangan, sehingga mengurangi aliasing,
  • ini dapat ditingkatkan menjadi CSM, yang melakukan hal yang sama tetapi Anda perlu membuat adegan untuk setiap kaskade dengan posisi tengah yang berbeda dari matriks tampilan cahaya berdasarkan titik pusat dari setiap irisan frustum.

Beberapa teknik dasar merapikan tepi bayangan:

  • jelas PCF, tetapi apakah dianjurkan untuk menggabungkan implementasi PCF Anda dengan perangkat keras PCF bawaan (dalam Opengl - using sampler2DShadow). Ini akan menghasilkan iterasi loop yang lebih sedikit dari sisi Anda dan PCF yang lebih murah,
  • blockiness of edge dapat ditukar dengan noise menggunakan Rotating Poisson Disk. Sampel yang digunakan untuk sampel dari peta bayangan diputar secara acak dengan setiap iterasi loop PCF.

Anda juga dapat meneliti teknik penghalusan tepi seperti:

  • rendering shadow map ke framebuffer yang diterapkan MSAA,
  • lebih lanjut meningkatkan PCF dengan interpolasi ,
  • meningkatkan jumlah sampel dengan campuran temporal .

Teknik dasar PCF menderita jerawat bayangan yang dapat diperbaiki dengan menerapkan beberapa offset dalam uji bayangan. Menghitung ukuran offset ini juga merupakan bidang penelitian .

Metode bayangan peta yang lebih maju lainnya meliputi:

  • Peta Bayangan Eksponensial dan Peta Bayangan Varians - dalam kebanyakan kasus tidak menderita jerawat bayangan dan menawarkan tepi yang halus tanpa kekakuan, tetapi dalam biaya beberapa situasi kebocoran ringan,
  • Exponential Variance Shadow Maps - teknik yang mungkin paling canggih dari pemetaan bayangan peta kedalaman 2D, menggabungkan kehalusan VSM dan mengatasi kebocoran cahaya, dengan biaya penggunaan memori dua kali lipat,
  • Persentase Closer Soft Shadows - teknik dasar meningkatkan peta bayangan tradisional dengan berbagai ukuran penumbra,
  • Multiview Shadow Maps - beberapa peta bayangan dari beberapa teknik, diatur pada cahaya area, untuk menghitung bayangan lembut realistis dengan berbagai ukuran penumbra,
  • Deep Shadow Maps - untuk meningkatkan penyebaran volumetrik dengan bayangan,
  • Real time ray menelusuri bayangan - mungkin masa depan.

Anda tidak gagal dengan PCF, sepertinya begitu :)

Saya berharap ada cara untuk menerapkan gaussian blur pada bayangan peta di ruang tampilan kamera, tetapi tidak berfungsi seperti yang diharapkan.

narthex
sumber
Sebagian dari komentar ini berterima kasih atas jawaban Anda, jadi saya pikir saya akan memberi tahu Anda karena Anda tidak akan mendapat pemberitahuan dari sana.
trichoplax
Ya, saya melihatnya tetapi terima kasih.
narthex
1

Anda telah mengatakan bahwa "... bilinear memfilter dalam tekstur ...". Tampaknya Anda menginterpolasi nilai kedalaman peta bayangan. Cara yang benar untuk menggunakan interpolasi dengan peta bayangan adalah menerapkannya pada hasil tes bayangan (sejauh yang saya ingat, OpenGL mendukung itu). Anda bahkan dapat menggabungkan interpolasi hasil tes bayangan dengan PCF, yang akan memberikan hasil yang jauh lebih baik. Namun, seperti yang mungkin Anda perhatikan, aliasing adalah wabah yang selalu mengejar pemetaan bayangan :)

Meskipun saya mengerti bahwa Anda mencari solusi mengenai pemetaan bayangan (bahkan karena itu cukup sederhana untuk diterapkan), apakah Anda pernah mempertimbangkan penggunaan volume bayangan? Ini jauh lebih rumit untuk diterapkan, tetapi tidak menderita aliasing sama sekali, dan saya pikir akan cocok dengan tujuan Anda.

Christian Pagot
sumber
Terima kasih banyak atas jawabannya! Untuk mendapatkan hasil yang saya cari, mungkin tepat untuk beralih ke volume bayangan. Link codeflow yang disediakan di bawah "interpolasi" sangat berguna - terima kasih!
Daniel M Gessel