Bagikan melalui


pengambilan sampel Nearest-Point (Direct3D 9)

Aplikasi tidak diperlukan untuk menggunakan pemfilteran tekstur. Direct3D dapat diatur sehingga menghitung alamat texel, yang sering tidak mengevaluasi bilangan bulat, dan menyalin warna texel dengan alamat bilangan bulat terdekat. Proses ini disebut pengambilan sampel titik terdekat. Ini bisa menjadi cara yang cepat dan efisien untuk memproses tekstur jika ukuran teksturnya mirip dengan ukuran gambar primitif di layar. Jika tidak, tekstur harus diperbesar atau dikurangi. Hasilnya bisa berupa gambar yang gugus, alias, atau kabur.

Aplikasi C++ Anda dapat memilih pengambilan sampel titik terdekat dengan memanggil metode IDirect3DDevice9::SetSamplerState . Atur nilai parameter pertama ke nomor indeks bilangan bulat (0-7) tekstur yang Anda pilih metode pemfilteran teksturnya. Teruskan D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER, atau D3DSAMP_MIPFILTER untuk parameter kedua guna mengatur filter pembesaran, minifikasi, atau mipmapping. Teruskan D3DTEXF_POINT di parameter ketiga.

Anda harus menggunakan pengambilan sampel titik terdekat dengan hati-hati, karena terkadang dapat menyebabkan artefak grafis ketika tekstur diambil sampelnya di batas antara dua texel. Batas ini adalah posisi di sepanjang tekstur (u atau v) di mana texel sampel beralih dari satu texel ke texel berikutnya. Ketika pengambilan sampel titik digunakan, sistem memilih satu sampel texel atau yang lain, dan hasilnya dapat berubah tiba-tiba dari satu texel ke texel berikutnya saat batas disilangkan. Efek ini dapat muncul sebagai artefak grafis yang tidak diinginkan dalam tekstur yang ditampilkan. Saat pemfilteran linier digunakan, texel yang dihasilkan dihitung dari kedua texel yang berdekatan dan menyatu dengan lancar di antara mereka saat indeks tekstur bergerak melalui batas.

Efek ini dapat dilihat ketika memetakan tekstur yang sangat kecil ke poligon yang sangat besar: operasi yang sering disebut pembesaran. Misalnya, saat menggunakan tekstur yang terlihat seperti kotak-kotak, pengambilan sampel titik terdekat menghasilkan kotak-kotak yang lebih besar yang menunjukkan tepi yang berbeda. Sebaliknya, pemfilteran tekstur linier menghasilkan gambar di mana warna kotak-kotak bervariasi dengan lancar di seluruh poligon.

Dalam kebanyakan kasus, aplikasi menerima hasil terbaik dengan menghindari sampel titik terdekat sedapat mungkin. Sebagian besar perangkat keras saat ini dioptimalkan untuk pemfilteran linier, sehingga aplikasi Anda tidak boleh mengalami penurunan performa. Jika efek yang Anda inginkan benar-benar memerlukan penggunaan pengambilan sampel titik terdekat - seperti saat menggunakan tekstur untuk menampilkan karakter teks yang dapat dibaca - maka aplikasi Anda harus sangat berhati-hati untuk menghindari pengambilan sampel di batas texel, yang dapat mengakibatkan efek yang tidak diinginkan. Ilustrasi berikut menunjukkan seperti apa artefak ini.

ilustrasi kotak enam bagian dengan garis horizontal nonkontinu di dua kotak kanan atas

Perhatikan bahwa dua kotak di kanan atas kelompok tampak berbeda dari tetangga mereka, dengan offset diagonal berjalan melalui mereka. Untuk menghindari artefak grafis seperti ini, Anda harus terbiasa dengan aturan pengambilan sampel tekstur Direct3D untuk pemfilteran titik terdekat. Direct3D memetakan koordinat tekstur floating-point mulai dari [0.0, 1.0] (0.0 hingga 1.0, inklusif) hingga nilai ruang texel bilangan bulat mulai dari [ - 0,5, n - 0,5], di mana n adalah jumlah texel dalam dimensi tertentu pada tekstur. Indeks tekstur yang dihasilkan dibulatkan ke bilangan bulat terdekat. Pemetaan ini dapat memperkenalkan ketidakakuratan pengambilan sampel pada batas texel.

Untuk contoh sederhana, bayangkan aplikasi yang merender poligon dengan mode penetapan alamat tekstur D3DTADDRESS_WRAP. Menggunakan pemetaan yang digunakan oleh Direct3D, indeks tekstur u dipetakan seperti yang ditunjukkan dalam diagram berikut untuk tekstur dengan lebar 4 texel.

diagram koordinat tekstur 0,0 dan 1,0 pada batas antara texel

Perhatikan bahwa koordinat tekstur, 0,0 dan 1,0 untuk ilustrasi ini, persis berada di batas antara texel. Menggunakan metode di mana Direct3D memetakan nilai, koordinat tekstur berkisar dari [ - 0,5, 4 - 0,5], di mana 4 adalah lebar tekstur. Untuk kasus ini, texel sampel adalah 0 texel untuk indeks tekstur 1,0. Namun, jika koordinat tekstur hanya sedikit kurang dari 1,0, texel sampel akan menjadi n texel alih-alih 0 texel.

Implikasinya adalah bahwa memperbesar tekstur kecil menggunakan koordinat tekstur tepat 0,0 dan 1,0 dengan pemfilteran titik terdekat pada segitiga selaras ruang layar menghasilkan piksel di mana peta tekstur diambil sampelnya di batas antara texel. Setiap ketidakakuratan dalam komputasi koordinat tekstur, namun kecil, menghasilkan artefak di sepanjang area dalam gambar yang dirender yang sesuai dengan tepi texel peta tekstur.

Melakukan pemetaan koordinat tekstur floating point ini ke texel bilangan bulat dengan akurasi sempurna sulit, memakan waktu komputasi, dan umumnya tidak diperlukan. Sebagian besar implementasi perangkat keras menggunakan pendekatan berulang untuk menghitung koordinat tekstur di setiap lokasi piksel dalam segitiga. Pendekatan berulang cenderung menyembunyikan ketidakakuratan ini karena kesalahan terakumulasi secara merata selama iterasi.

Rasterizer referensi Direct3D menggunakan pendekatan evaluasi langsung untuk menghitung indeks tekstur di setiap lokasi piksel. Evaluasi langsung berbeda dari pendekatan berulang karena ketidakakuratan dalam operasi menunjukkan distribusi kesalahan yang lebih acak. Hasilnya adalah bahwa kesalahan pengambilan sampel yang terjadi pada batas dapat lebih terlihat karena rasterizer referensi tidak melakukan operasi ini dengan akurasi sempurna.

Pendekatan terbaik adalah menggunakan pemfilteran titik terdekat hanya jika perlu. Ketika Anda harus menggunakannya, disarankan agar Anda mengimbangi koordinat tekstur sedikit dari posisi batas untuk menghindari artefak.

Pemfilteran Tekstur