Pemfilteran Tekstur dengan Mipmaps (Direct3D 9)
Mipmap adalah urutan tekstur, yang masing-masing merupakan representasi resolusi yang semakin rendah dari gambar yang sama. Tinggi dan lebar setiap gambar, atau tingkat, dalam mipmap adalah kekuatan dua lebih kecil dari tingkat sebelumnya. Mipmaps tidak harus persegi.
Gambar mipmap resolusi tinggi digunakan untuk objek yang dekat dengan pengguna. Gambar resolusi bawah digunakan sebagai objek tampak lebih jauh. Mipmapping meningkatkan kualitas tekstur yang dirender dengan mengorbankan penggunaan lebih banyak memori.
Direct3D mewakili mipmaps sebagai rantai permukaan yang terpasang. Tekstur resolusi tertinggi ada di kepala rantai dan memiliki tingkat mipmap berikutnya sebagai lampiran. Pada gilirannya, tingkat tersebut memiliki lampiran yang merupakan tingkat berikutnya dalam mipmap, dan sebagainya, turun ke tingkat resolusi terendah mipmap.
Ilustrasi berikut menunjukkan contoh tingkat ini. Tekstur bitmap mewakili tanda pada kontainer dalam game 3D orang pertama. Saat dibuat sebagai mipmap, tekstur resolusi tertinggi adalah yang pertama dalam set. Setiap tekstur yang berhasil dalam set mipmap lebih kecil tinggi dan lebar dengan kekuatan 2. Dalam hal ini, mipmap resolusi maksimum adalah 256 piksel dengan 256 piksel. Selanjutnya, teksturnya adalah 128x128. Tekstur terakhir dalam rantai adalah 64x64.
Tanda ini memiliki jarak maksimum dari mana ia terlihat. Jika pengguna mulai jauh dari tanda, game menampilkan tekstur terkecil dalam rantai mipmap, yang dalam hal ini tekstur 64x64.
Saat pengguna memindahkan sudut pandang lebih dekat ke tanda, tekstur resolusi yang semakin tinggi dalam rantai mipmap digunakan. Resolusi dalam ilustrasi berikut adalah 128x128.
Tekstur resolusi tertinggi digunakan ketika sudut pandang pengguna berada pada jarak minimum yang diizinkan dari tanda, seperti yang ditunjukkan dalam ilustrasi berikut.
Ini adalah cara yang lebih efisien untuk mensimulasikan perspektif untuk tekstur. Daripada merender tekstur tunggal pada banyak resolusi, lebih cepat menggunakan beberapa tekstur pada resolusi yang bervariasi.
Direct3D dapat menilai tekstur mana dalam set mipmap yang merupakan resolusi terdekat dengan output yang diinginkan, dan dapat memetakan piksel ke ruang texelnya. Jika resolusi gambar akhir berada di antara resolusi tekstur dalam set mipmap, Direct3D dapat memeriksa texel dalam mipmap dan memadukan nilai warnanya bersama-sama.
Untuk menggunakan mipmaps, aplikasi Anda harus membangun sekumpulan mipmap. Aplikasi menerapkan mipmaps dengan memilih mipmap yang ditetapkan sebagai tekstur pertama dalam kumpulan tekstur saat ini. Untuk informasi selengkapnya, lihat Penpaduan Tekstur (Direct3D 9).
Selanjutnya, aplikasi Anda harus mengatur metode pemfilteran yang digunakan Direct3D untuk mengambil sampel texel. Metode tercepat pemfilteran mipmap adalah meminta Direct3D memilih texel terdekat. Gunakan nilai D3DTEXF_POINT yang dijumlahkan untuk memilih ini. Direct3D dapat menghasilkan hasil pemfilteran yang lebih baik jika aplikasi Anda menggunakan nilai enumerasi D3DTEXF_LINEAR. Ini memilih mipmap terdekat, lalu menghitung rata-rata texel tertimbang di sekitar lokasi dalam tekstur tempat piksel saat ini dipetakan.
Tekstur Mipmap digunakan dalam adegan 3D untuk mengurangi waktu yang diperlukan untuk merender adegan. Mereka juga meningkatkan realisme adegan. Namun, mereka sering membutuhkan memori dalam jumlah besar.
Membuat Sekumpulan Mipmaps
Contoh berikut menunjukkan bagaimana aplikasi Anda dapat memanggil metode IDirect3DDevice9::CreateTexture untuk membangun rantai lima tingkat mipmap: 256x256, 128x128, 64x64, 32x32, dan 16x16.
// This code example assumes that m_d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface
IDirect3DTexture9 * pMipMap;
m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8,
D3DPOOL_MANAGED, &pMipMap);
Dua parameter pertama yang diterima oleh IDirect3DDevice9::CreateTexture adalah ukuran dan lebar tekstur tingkat atas. Parameter ketiga menentukan jumlah tingkat dalam tekstur. Jika Anda mengatur ini ke nol, Direct3D membuat rantai permukaan, masing-masing kekuatan dua lebih kecil dari yang sebelumnya, hingga ukuran sekecil mungkin 1x1. Parameter keempat menentukan penggunaan untuk sumber daya ini; dalam hal ini, 0 ditentukan untuk menunjukkan tidak ada penggunaan khusus untuk sumber daya. Parameter kelima menentukan format permukaan untuk tekstur. Gunakan nilai dari jenis enumerasi D3DFORMAT untuk parameter ini. Parameter keenam menentukan anggota jenis enumerasi D3DPOOL yang menunjukkan kelas memori untuk menempatkan sumber daya yang dibuat. Kecuali Anda menggunakan tekstur dinamis, D3DPOOL_MANAGED disarankan. Parameter akhir mengambil alamat pointer ke antarmuka IDirect3DTexture9 .
Catatan
Setiap permukaan dalam rantai mipmap memiliki dimensi yang merupakan setengah dari permukaan sebelumnya dalam rantai. Jika mipmap tingkat atas memiliki dimensi 256x128, dimensi mipmap tingkat kedua adalah 128x64, tingkat ketiga adalah 64x32, dan sebagainya, turun ke 1x1. Anda tidak dapat meminta sejumlah tingkat mipmap di Tingkat yang akan menyebabkan lebar atau tinggi mipmap apa pun dalam rantai menjadi lebih kecil dari 1. Dalam kasus sederhana permukaan mipmap tingkat atas 4x2, nilai maksimum yang diizinkan untuk Level adalah tiga. Dimensi tingkat atas adalah 4x2, dimensi tingkat kedua adalah 2x1, dan dimensi untuk tingkat ketiga adalah 1x1. Nilai yang lebih besar dari 3 dalam Level menghasilkan nilai pecahan dalam tinggi mipmap tingkat kedua, dan karenanya tidak diizinkan.
Memilih dan Menampilkan Mipmap
Panggil metode IDirect3DDevice9::SetTexture untuk mengatur tekstur mipmap yang ditetapkan sebagai tekstur pertama dalam daftar tekstur saat ini. Untuk informasi selengkapnya, lihat Penpaduan Tekstur (Direct3D 9).
Setelah aplikasi Anda memilih kumpulan tekstur mipmap, aplikasi harus menetapkan nilai dari jenis enumerasi D3DTEXTUREFILTERTYPE ke status sampler D3DSAMP_MIPFILTER. Direct3D kemudian secara otomatis melakukan pemfilteran tekstur mipmap. Mengaktifkan pemfilteran tekstur mipmap ditunjukkan dalam contoh kode berikut.
m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
Aplikasi Anda juga dapat melintasi rantai permukaan mipmap secara manual dengan menggunakan metode IDirect3DTexture9::GetSurfaceLevel dan menentukan tingkat mipmap yang akan diambil. Contoh berikut melintasi rantai mipmap dari resolusi tertinggi ke terendah.
IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
// Process this level
pSurfaceLevel->Release();
}
Aplikasi perlu melintasi rantai mipmap secara manual untuk memuat data bitmap ke setiap permukaan dalam rantai. Ini biasanya satu-satunya alasan untuk melintasi rantai. Aplikasi dapat mengambil jumlah tingkat dalam mipmap dengan memanggil IDirect3DBaseTexture9::GetLevelCount.
Topik terkait