Decals normal masalah tangguhan

11

Saya telah mengerjakan sistem decal yang ditangguhkan. Sejauh ini saya telah menyelesaikan bagian proyeksi, artinya saya dapat mengklik sesuatu di tempat kejadian dan itu akan memproyeksikan decal dengan benar ke permukaan objek.

Ada beberapa hal lain yang ingin saya tambahkan ke sistem ini: kliping normal dan decals yang dipetakan normal. Kliping normal adalah ketika saya membuang fragmen yang direntangkan melintasi sudut yang tajam. Terlihat di sini . Cara untuk mengatasi ini adalah dengan membuang fragmen yang memiliki perbedaan besar antara normal dalam G-Buffer dan normal decal. Ini akan membutuhkan membaca tekstur normal G-buffer.

Untuk melakukan pemetaan normal decal, saya perlu mencampur normal decal (dari peta normal) dengan G-buffer's normal. Yang membutuhkan penulisan dengan tekstur normal G-buffer.

Saya harap jelas bahwa untuk mendukung kedua fitur ini, saya perlu membaca dan menulis ke tekstur normal pada shader pass yang sama. Sayangnya, ini adalah perilaku yang tidak terdefinisi, jadi saya bertanya-tanya apakah ada cara lain untuk mengimplementasikan fitur-fitur ini.

Ian
sumber

Jawaban:

1

Sistem rendering apa yang Anda gunakan? Informasi berikut ini harus valid untuk semua sistem render, tetapi dalam DX11 atau versi OpenGL yang lebih baru mungkin ada solusi yang lebih baik menggunakan UAV.

-

Anda harus menyalin buffer normal sebelum setiap pass. Selama Anda tahu bahwa decals tidak mengubah fragmen ruang layar yang sama Anda tidak perlu memperbarui salinannya.

Anda juga dapat membuat semua decals menjadi buffer yang terpisah dan hanya melakukan satu campuran campuran ke buffer normal Anda menggunakan satu salinan buffer normal. Ini akan skala jauh lebih baik dengan jumlah decals yang Anda miliki.

Selama Anda tidak menulis buffer normal, mis. Hanya melakukan kliping normal, seperti yang Anda sebut, Anda hanya dapat mengambil sampel buffer normal asli tetapi Anda tidak dapat mengikatnya sebagai target render.

Di DX9 saya menemukan bahwa membaca dan menulis ke hasil tekstur yang sama dalam output yang diharapkan selama Anda hanya menggunakan penyaringan titik terdekat dan tidak pernah membaca piksel yang berbeda dari yang Anda tulis saat ini, TETAPI! karena ini adalah perilaku yang tidak terdefinisi mungkin ada driver dan kartu grafis yang tidak berperilaku seperti ini. DX10 akan mencegah Anda melakukan ini dengan melepaskan ikatan tekstur yang saat ini terikat sebagai target render.

Archy
sumber