Saya mengutak-atik pemodelan 3D prosedural sederhana untuk membuat bangunan mungil untuk pencetakan 3D. Sebuah contoh:
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:
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:
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:
Inilah contoh kasus tunggal dengan pemfilteran bilinear dinonaktifkan:
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.
sumber
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.
sumber