Nah, apa itu peta bayangan? Peta bayangan adalah tekstur siapa yang menjawab pertanyaan sederhana: pada jarak berapa dari cahaya, sepanjang arah yang diwakili oleh texel, apakah cahayanya tersumbat? Koordinat tekstur dihasilkan menggunakan berbagai cara textive proyektif, tergantung pada algoritma pemetaan bayangan tertentu.
Tekstur projektif hanyalah cara mengubah objek menjadi ruang tekstur (dan ya, saya tahu itu terdengar mundur. Tapi begitulah cara kerjanya). Algoritma pemetaan bayangan menggunakan beberapa jenis transformasi. Tetapi pada akhirnya, ini hanyalah transformasi dari satu ruang ke ruang lainnya.
Saat merender peta bayangan, Anda mengambil simpul geometri Anda dan mengubahnya melalui pipa render standar. Tetapi kamera dan matriks proyeksi dirancang untuk posisi dan arah cahaya Anda, bukan untuk posisi tampilan dan orientasi.
Saat melakukan rendering maju dengan peta bayangan, Anda membuat objek seperti biasa, mengubah simpul menjadi ruang kamera tampilan dan melalui matriks proyeksi menonton. Namun, Anda juga mengubah simpul melalui kamera cahaya dan matriks proyeksi, meneruskannya sebagai data per-simpul ke shader fragmen. Ini menggunakan mereka melalui texturing proyektif untuk mengakses tekstur bayangan.
Inilah poin pentingnya. Akses tekstur proyektif dirancang sedemikian rupa sehingga lokasi yang diaksesnya pada tekstur mewakili arah antara titik di permukaan (titik yang Anda render dalam fragmen shader) dan cahaya. Oleh karena itu, ia mengambil texel yang mewakili kedalaman di mana oklusi terjadi untuk fragmen yang diberikan.
Tapi tidak ada yang istimewa dari pipa ini. Anda tidak perlu mengubah posisi simpul menjadi tekstur bayangan dan meneruskannya ke fragmen shader. Anda bisa meneruskan posisi verteks ruang-dunia ke shader fragmen, dan kemudian meminta shader fragmen mengubahnya menjadi ruang proyektif tekstur bayangan. Memang, Anda akan membuang banyak kinerja, karena Anda akan menghasilkan koordinat tekstur yang sama persis. Tapi ini layak secara matematis.
Memang, Anda bisa meneruskan tampilan posisi verteks ruang-kamera ke shader fragmen. Kemudian bisa mengubah mereka menjadi dunia, lalu menjadi ruang kamera cahaya, lalu menjadi ruang tekstur bayangan projektif. Anda dapat menempatkan semua transformasi itu menjadi satu matriks (tergantung pada algoritma proyeksi bayangan Anda). Sekali lagi, ini memberi Anda persis apa yang Anda miliki sebelumnya, jadi ketika meneruskan rendering, tidak ada alasan untuk melakukannya.
Namun dalam rendering yang ditangguhkan , Anda sudah memiliki posisi verteks ruang kamera. Anda harus, jika tidak, Anda tidak dapat melakukan pencahayaan. Anda menghabiskan banyak memori dan bandwidth dengan menuliskannya ke buffer, atau Anda pintar dan menghitungnya menggunakan buffer kedalaman dan berbagai matematika (yang tidak akan saya bahas di sini, tetapi dibahas secara online).
Apa pun yang terjadi, Anda dapat melihat posisi ruang kamera. Dan, seperti yang dinyatakan di atas, kita dapat menerapkan matriks untuk mengubahnya dari tampilan ruang kamera menjadi ruang tekstur projektif bayangan. Jadi ... lakukan itu. Kemudian akses peta bayangan Anda.
Masalah terpecahkan.