Bagikan melalui


Pemetaan Lingkungan Kubik (Direct3D 9)

Peta lingkungan kubik - kadang-kadang disebut sebagai peta kubus - adalah tekstur yang berisi data gambar yang mewakili adegan yang mengelilingi objek, seolah-olah objek berada di tengah kubus. Setiap wajah peta lingkungan kubik mencakup bidang pandang 90 derajat di horizontal dan vertikal, dan ada enam wajah per peta kubus. Orientasi wajah ditampilkan dalam ilustrasi berikut.

illustration of a cube with central coordinate axes perpendicular to cube faces

Setiap wajah kubus berorientasi tegak lurus dengan bidang x/y, y/z, atau x/z, di ruang dunia. Ilustrasi berikut menunjukkan bagaimana setiap bidang sesuai dengan wajah.

illustration of cube faces with coordinate projections from planes

Peta lingkungan kubik diimplementasikan sebagai serangkaian objek tekstur. Aplikasi dapat menggunakan gambar statis untuk pemetaan lingkungan kubik, atau mereka dapat merender ke wajah peta kubus untuk melakukan pemetaan lingkungan dinamis. Teknik ini mengharuskan permukaan peta kubus menjadi permukaan target render yang valid, dibuat dengan set bendera D3DUSAGE_RENDERTARGET.

Wajah peta kubus tidak perlu berisi rendering yang sangat rinci dari adegan di sekitarnya. Dalam kebanyakan kasus, peta lingkungan diterapkan ke permukaan melengkung. Mengingat jumlah kelengkungan yang digunakan oleh sebagian besar aplikasi, distorsi reflektif yang dihasilkan membuat detail ekstrem dalam peta lingkungan boros dalam hal memori dan penyajian overhead.

Peta Lingkungan Kubik Mipmapped

Peta kubus dapat di-mipmapped. Untuk membuat peta kubus mipmapped, atur parameter Tingkat metode CreateCubeTexture ke jumlah tingkat yang Anda inginkan. Anda dapat membayangkan topografi permukaan ini seperti yang ditunjukkan dalam diagram berikut.

diagram of a mipmapped cube map with n mip levels

Aplikasi yang membuat peta lingkungan kubik mipmapped dapat mengakses setiap wajah dengan memanggil metode GetCubeMapSurface. Mulailah dengan mengatur nilai yang sesuai dari jenis enumerasi D3DCUBEMAP_FACES, seperti yang dibahas dalam Membuat Permukaan Peta Lingkungan Kubik (Direct3D 9). Selanjutnya, pilih tingkat yang akan diambil dengan mengatur parameter tingkat GetCubeMapSurface ke tingkat mipmap yang Anda inginkan. Ingatlah bahwa 0 sesuai dengan gambar tingkat atas.

Koordinat Tekstur untuk Lingkungan Kubik Peta

Koordinat tekstur yang mengindeks peta lingkungan kubik tidak sederhana u, koordinat gaya v, seperti yang digunakan saat tekstur standar diterapkan. Bahkan, peta lingkungan kubik tidak menggunakan koordinat tekstur sekalipun. Sebagai pengganti satu set koordinat tekstur, peta lingkungan kubik memerlukan vektor 3D. Anda harus berhati-hati untuk menentukan format puncak yang tepat. Selain memberi tahu sistem berapa banyak set koordinat tekstur yang digunakan aplikasi Anda, Anda harus memberikan informasi tentang berapa banyak elemen dalam setiap set. Direct3D menawarkan set makro D3DFVF_TEXCOORDSIZEN untuk tujuan ini. Makro ini menerima satu parameter, mengidentifikasi indeks kumpulan koordinat tekstur yang ukurannya sedang dijelaskan. Dalam kasus vektor 3D, Anda menyertakan pola bit yang dibuat oleh makro D3DFVF_TEXCOORDSIZE3. Contoh kode berikut menunjukkan bagaimana makro ini digunakan.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

Dalam beberapa kasus, seperti pemetaan cahaya difus, Anda menggunakan vertex ruang kamera normal untuk vektor. Dalam kasus lain, seperti pemetaan lingkungan spekular, Anda menggunakan vektor refleksi. Karena normal verteks yang diubah dipahami secara luas, informasi di sini berkonsentrasi pada komputasi vektor pantulan.

Menghitung vektor refleksi sendiri memerlukan pemahaman tentang posisi setiap verteks, dan vektor dari titik pandang ke vertex tersebut. Direct3D dapat secara otomatis menghitung vektor refleksi untuk geometri Anda. Menggunakan fitur ini menyimpan memori karena Anda tidak perlu menyertakan koordinat tekstur untuk peta lingkungan. Ini juga mengurangi bandwidth dan, dalam kasus Perangkat T&L HAL, itu bisa jauh lebih cepat daripada komputasi yang dapat dibuat aplikasi Anda sendiri. Untuk menggunakan fitur ini, dalam tahap tekstur yang berisi peta lingkungan kubik, atur status tahap tekstur D3DTSS_TEXCOORDINDEX ke kombinasi anggota D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR D3DTEXTURESTAGESTATETYPE dan indeks kumpulan koordinat tekstur. Dalam beberapa situasi, seperti pemetaan cahaya difus, Anda dapat menggunakan anggota D3DTSS_TCI_CAMERASPACENORMAL D3DTEXTURESTAGESTATETYPE, yang menyebabkan sistem menggunakan transformasi, ruang kamera, vertex normal sebagai vektor alamat untuk tekstur. Indeks hanya digunakan oleh sistem untuk menentukan mode pembungkusan untuk tekstur.

Contoh kode berikut menunjukkan bagaimana nilai ini digunakan.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

Saat Anda mengaktifkan pembuatan koordinat tekstur otomatis, sistem menggunakan salah satu dari dua rumus untuk menghitung vektor pantulan untuk setiap verteks. Saat status render D3DRS_LOCALVIEWER diatur ke TRUE, rumus berikut digunakan.

formula of the reflection vector (r = 2(exn)n-e)

Dalam rumus sebelumnya, R adalah vektor pantulan yang dihitung, E adalah vektor posisi-ke-mata yang dinormalisasi, dan N adalah verteks ruang kamera normal.

Saat status render D3DRS_LOCALVIEWER diatur ke FALSE, sistem menggunakan rumus berikut.

formula of the reflection vector (r = 2nzn-i)

Elemen R dan N dalam rumus ini identik dengan rumus sebelumnya. Elemen NZ adalah z ruang dunia dari puncak normal, dan saya adalah vektor (0,0,1) dari sudut pandang yang sangat jauh. Sistem menggunakan vektor pantulan dari salah satu rumus untuk memilih dan mengatasi wajah peta kubus yang sesuai.

Catatan

Dalam kebanyakan kasus, aplikasi harus mengaktifkan normalisasi otomatis normal vertex. Untuk melakukan ini, atur D3DRS_NORMALIZENORMALS ke TRUE. Jika Anda tidak mengaktifkan status render ini, tampilan peta lingkungan akan berbeda secara drastis dari yang Anda harapkan.

 

Informasi tambahan terkandung dalam topik berikut.

Pemetaan Lingkungan