Mewakili PRT Dengan Tekstur (Direct3D 9)
Sampel PRTDemo dan simulator PRTCmdLine yang disertakan dalam DirectX SDK mewakili vektor transfer di simpul jala. Untuk mewakili sinyal PRT secara akurat, ini dapat memerlukan tessellations yang mungkin tidak praktis untuk game saat ini. Mewakili vektor transfer dalam peta tekstur adalah pendekatan alternatif yang memiliki biaya data yang sama terlepas dari kompleksitas jala. Ada beberapa cara untuk menghasilkan peta tekstur vektor transfer menggunakan Pustaka D3DX PRT.
Precomputing Transfer Vektor
Salah satu pendekatannya adalah memodifikasi sampel PRTDemo dan PRTCmdLine untuk menghitung vektor transfer di setiap texel dalam parameterisasi permukaan. Untuk melakukan ini:
- Ubah panggilan ke D3DXCreatePRTEngine untuk mengekstrak koordinat tekstur dari jala (ExtractUVs harus TRUE)
- Ganti panggilan D3DXCreatePRTBuffer dengan D3DXCreatePRTBufferTex menggunakan ukuran tekstur yang sama.
Semua metode ID3DXPRTEngine berfungsi dengan simulasi per texel kecuali untuk: ComputeBounceAdaptive, ComputeSSAdaptive, ComputeSS, dan ComputeDirectLightingSHAdaptive. Meskipun simulasi ruang tekstur akan menghasilkan hasil yang benar, simulasi tersebut sering kali cukup lambat karena kemungkinan besar akan menjadi vektor transfer komputasi pada kepadatan tinggi.
Pendekatan lain adalah menghitung simulasi PRT per verteks adaptif (dengan koordinat tekstur yang akan digunakan untuk data per texel) lalu memanggil ID3DXPRTEngine::ResampleBuffer (menggunakan buffer output yang dibuat menggunakan D3DXCreatePRTBufferTex pada resolusi yang sesuai). Ini berfungsi dengan semua fungsionalitas D3DX PRT di SDK dan sering kali bisa jauh lebih efisien daripada secara langsung menghitung buffer transfer per texel.
Penghitungan Runtime
Jika satu kluster digunakan, hasilnya dapat difilter dan dipetakan mip seperti tekstur lainnya dan shader piksel identik dengan kode shader vertex yang dikirim dengan PRTDemo.
Jika kompresi menghasilkan beberapa kluster, Anda tidak dapat memfilter atau memigrasikan data karena indeks pengklusteran tidak berkelanjutan. Berikut adalah beberapa alternatif untuk menangani data multikluster:
- Lakukan semua pemfilteran sendiri di shader piksel. Sayangnya, ini umumnya tidak praktis karena alasan performa.
- Jika tekstur beresolusi rendah bukan tekstur yang dipetakan mip (yaitu: peta cahaya), kemungkinan besar lebih efisien untuk hanya menghitung pencahayaan langsung di ruang tekstur - di mana tidak ada pemfilteran yang akan terjadi, dan merender objek dengan tekstur berbayang. Ini pada dasarnya adalah peta cahaya dinamis yang dibuat sepenuhnya pada GPU.
- Jika atlas tekstur digunakan (lihat Menggunakan UVAtlas (Direct3D 9)), Anda dapat mengklusterkan adegan secara manual dengan memiliki semua vektor transfer dalam komponen yang terhubung di ruang tekstur berada di kluster yang sama. Dengan cara ini Anda dapat memfilter tekstur karena semua texel yang diakses akan berada di kluster yang sama dengan konstruksi. ID kluster untuk wajah tertentu dapat disebarluaskan dari shader vertex.
Shader piksel memiliki lebih sedikit register konstanta yang tidak dapat diindeks, sehingga pemecah piksel agak berbeda dari shader vertex. Menyimpan pekerjaan per kluster dalam tekstur dinamis resolusi rendah dan menggunakan beban tekstur akan menjadi cara paling efisien untuk merender saat menggunakan beberapa kluster.
Topik terkait