RSS

FILTERING dan MULTITEXTURE

FILTERING

Koordinat tekstur biasanya digambarkan sebagai floating-point nilai. Kita baru saja melihat bagaimana mereka dapat memperpanjang di luar jangkauan 0 .. 1, tapi pada bagian ini, dapat kita asumsikan mereka dibatasi ke 0 .. 1 nilai. Kita dapat melipat gandakan koordinat tekstur dengan ukuran peta tekstur untuk mendapatkan Texel kita harus berlaku untuk diberikan pixel. 
Sebagai contoh :

Sebuah koordinat tekstur dari (0.75,0.35) diterapkan pada peta 256x256 akan berakhir dipetakan di Texel (192, 89,6). Koordinat U adalah nilai integer, tapi perhatikan bagaimana nilai V jatuh pada tengah dua nilai, atau texels.
 
Kita bisa memilih untuk memotong atau membulatkan nilai ke integer terdekat, tapi itu akan mengakibatkan tampilan canggung. Tekstur akan berkedip dengan gerakan kamera yang halus sebagai piksel "melompat" dari satu ke Texel lain. Itulah mengapa sebagian besar kartu grafis filtering tekstur dukungan, yang rata-rata nilai Texel menggunakan berbeda filter untuk mendapatkan penampilan yang tepat.

Sebuah kartu tanpa penyaringan, seperti model awal dan rasterizers sebagian besar perangkat lunak, dikatakan menggunakan terdekat tetangga kebijakan. Ini putaran nilai Texel ke integer terdekat. Tapi filter tekstur yang paling populer adalah bilinear filtering, yang menyaring baik di U dan V arah menggunakan dua nilai berdekatan. Pada sebelumnya kasus, nilai U akan tetap unfiltered karena itu sudah angka integer, sedangkan nilai V akan menjadi komposit dari 60 persen dari Texel (192,90) dan 40 persen dari Texel (192,89).

Jenis yang lebih canggih dari penyaringan adalah penyaringan trilinear, yang digunakan dalam strategi mipmapping. Mipmapping adalah teknik yang sangat penting yang akan kita bahas dalam bagian berikutnya. Apapun masalahnya, penyaringan tekstur biasanya tersedia di bawah API pemrograman yang paling. Pada OpenGL, penyaringan dapat diatur per tekstur, sehingga masing-masing dapat memiliki pilihan sendiri penyaringan.
Panggilan fungsi yang dibutuhkan adalah


glTexParameteri (GLenum target, GLenum pname, GLenum param);

dimana target baik harus GL_TEXTURE_1D atau GL_TEXTURE_2D tergantung pada jenis tekstur.
Kedua parameter, pname, menentukan filter mana yang ingin kita ubah. OpenGL memiliki filter pembesaran, yang digunakan setiap kali Texel yang ditugaskan ke daerah lebih besar dari pixel, dan filter minification, yang diterapkan untuk texels ukuran subpixel. Kedua konstanta simbolis yang GL_TEXTURE_MIN_FILTER dan GL_TEXTURE_MAG_FILTER. Parameter terakhir (Glenum param) digunakan untuk menentukan nilai yang dipilih menyaring. Nilai yang tersedia adalah GL_NEAREST dan GL_LINEAR, yang menetapkan penyaringan bilinear. Berikut adalah kode untuk mengatur bilinear tekstur bawah OpenGL:

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Di bawah DirectX, hasil yang sama dapat dicapai dengan samplers tekstur, yang adalah obyek yang menentukan bagaimana tekstur peta diakses dan disaring. Berikut adalah kode sumber yang setara:

IDirect3DDevice9 :: SetSamplerState (0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
IDirect3DDevice9 :: SetSamplerState (0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

Di bawah DirectX, hasil yang sama dapat dicapai dengan samplers tekstur, yang adalah obyek yang menentukan
bagaimana tekstur peta diakses dan disaring. Berikut adalah kode sumber yang setara:

IDirect3DDevice9 :: SetSamplerState (0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
IDirect3DDevice9 :: SetSamplerState (0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

MULTITEXTURE

Multitexture-mampu perangkat keras telah sangat populer sejak usia kartu Voodoo2 3dfx. Multitexture pada dasarnya memungkinkan kita untuk menetapkan tekstur N koordinat segitiga yang sama, sehingga kita dapat membuat lebih dari satu tekstur dalam satu langkah. Selain itu, kita dapat menentukan fungsi aritmatika tekstur yang berbeda, sehingga kita bisa mengontrol cara tekstur peta berbeda digabungkan.
Multitexturing merupakan inti dari algoritma render paling canggih, dari pemetaan cahaya untuk bertemu pemetaan. Hal ini dapat diakses dari kedua OpenGL (dulu ekstensi, tetapi sekarang adalah bagian dari standar) dan sebagai bagian dari fungsi inti dalam Direct3D. Mari kita review pertama bagaimana kita dapat menentukan multitexture bawah kedua API.
Di bawah OpenGL, multitexture dinyatakan sebagai berikut:
/ / Lapisan 0
glActiveTexture (GL_TEXTURE0);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, ID0);
/ / Di sini kami akan mengatur parameter tekstur kombinasi untuk lapisan 0
/ / Lapisan 1: memodulasi warna masuk + tekstur
glActiveTexture (GL_TEXTURE1);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, id1);
/ / Di sini kami akan mengatur parameter tekstur kombinasi untuk lapisan 1
/ / Membuat geometri
glBegin (GL_TRIANGLES);
glMultiTexCoord2fARB (GL_TEXTURE0_ARB, U0, v0);
glMultiTexCoord2fARB (GL_TEXTURE1_ARB, u1, v1);
glVertex3f (px, py, pz);
(...)
glEnd ();
Kita perlu menginisialisasi setiap unit tekstur secara terpisah, memungkinkan pemetaan tekstur dan pengaturan peta tekstur kita ingin menggunakan dengan masing-masing. Perhatikan bagaimana kami memiliki beberapa ruang untuk kode kombinasi tekstur. Bagaimana akan baik peta dicampur bersama-sama? Jelas, tidak masuk akal untuk membuat kedua peta dengan pencampuran tidak pilihan sama sekali. Tapi karena ini adalah subyek dari bagian berikutnya, saya lebih memilih untuk menjaga kode sederhana dan mudah untuk mengikuti.
Juga, perhatikan perubahan pada tahap render geometri. Kita perlu mengatur koordinat tekstur untuk setiap unit tekstur secara terpisah, sehingga unit yang berbeda dapat memetakan dengan koordinat yang berbeda. Mari kita sekarang memeriksa bagaimana kita dapat menentukan pilihan blending untuk peta tekstur.