Wednesday, July 11, 2012

BUMP MAPPING


Pemetaan Bump mensimulasikan detail-tinggi penyimpangan permukaan, tidak dengan menggunakan geometri tambahan tetapi oleh normal perturbing. Karena normals adalah kekuatan pendorong dibelakang persamaan yang paling render, shading secara lokal sudah dimodifikasi, memberikan ilusi benjolan, keriput, dan sebagainya untuk penampil.

Pemetaan Bump diperkenalkan oleh Blinn pada akhir tahun 1970 dan sekarang menjadi teknik yang sangat populer di Pengunjung penyaji. Perlahan, permainan semakin banyak menggabungkan itu juga, sebagai produsen perangkat keras terus menemukan yang lebih sederhana, cara yang lebih kuat untuk menentukan pemetaan bump. Pada bagian ini, kita akan meninjau tiga metode yang paling populer bersama dengan beberapa kode tertentu untuk menghasilkan pemetaan benjolan dalam DirectX.

EMBOSS BUMP MAPPING
Gambar Embossing adalah operasi pengolahan yang meningkatkan tepi terarah, membuat emboss terlihat terangkat. Pemetaan Emboss bump mencoba untuk mencapai hasil yang sama secara real time dengan menggunakan beberapa texturing yang sebelumnya. Secara khusus, algoritma klasik menggunakan tiga yang lalu. Inilah ikhtisar lengkap:

1. Render objek dengan peta benjolan di grayscale.
2. Hitung (u, v) koordinat diterjemahkan ke arah cahaya.
3. Render peta bump lagi, untuk mengurangi dari pertama.
4. Render tekstur berbayang akhir.

Kita dapat mengurangi ini untuk dua langkah dengan pengkodean peta bump di alpha channel, sehingga algoritma ini adalah sebagai berikut:

1. Render tekstur dasar dengan peta bump sebagai alpha channel.
2. Tambahkan versi negatif dari peta bump.

Seperti yang Anda mungkin telah duga,  pencampuran antara RGB dan alpha channel harus multiply, jadi kami menerapkan persamaan Lambert untuk penerangan difus. DirectX 9 contoh berikut menggunakan pendekatan ini:
m_pd3dDev->SetTexture( 0, m_pEmbossTexture );
m_pd3dDev->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
m_pd3dDev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE );
m_pd3dDev->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
m_pd3dDev->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE );
m_pd3dDev->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
m_pd3dDev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pd3dDev->SetTexture( 1, m_pEmbossTexture );
m_pd3dDev->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1 );
m_pd3dDev->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_SELECTARG2);
m_pd3dDev->SetTextureStageState(1, D3DTSS_COLORARG1,D3DTA_TEXTURE);

m_pd3dDev->SetTextureStageState(1,D3DTSS_ALPHAOP, D3DTOP_ADDSIGNED );
m_pd3dDev->SetTextureStageState(1,D3DTSS_ALPHAARG1, D3DTA_TEXTURE | D3DTA_COMPLEMENT );
m_pd3dDev->SetTextureStageState(1,D3DTSS_ALPHAARG2,D3DTA_CURRENT );
m_pd3dDev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_pd3dDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_pd3dDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
m_pObject->Render( m_pd3dDevice );

Perhatikan bagaimana kita mengatur tekstur tahap 1 untuk kita melakukan penambahan sementara melengkapi peta.

Bagian kompleks algoritma setiap pemetaan emboss bump adalah bagaimana untuk menghitung arah cahaya, dengan menggeser u , nilai tekstur v untuk mensimulasikan bump. Kita harus mulai dengan menempatkan sistem koordinat di titik dan mengekspresikan arah cahaya dalam hal koordinat tersebut. Vektor pertama yang akan kita gunakan adalah normal pada simpul. Vektor kedua adalah vektor bersama baik u atau sumbu koordinat tekstur v, bersinggungan dengan permukaan. Vektor ketiga, dijuluki binormal, hanya produk silang antara normal dan tangen vektor. Ketiga vektor sesuai matriks dasar, yang dapat digunakan untuk mengubah arah cahaya untuk lokal koordinat. Ini vektor baru yang dikatakan dalam ruang tangen objek. Dengan skala itu (tergantung pada jumlah benjolan kita ingin mensimulasikan), kita dapat menambahkan X dan Y ke komponen u, berpasang-pasang v, dan dengan demikian menghasilkan efek benjolan peta terlihat bagus.

DOT3 BUMP MAPPING
Metode benjolan Dot3 pemetaan dimulai bukan dengan medan tinggi sebagai pemetaan benjolan timbul dilakukan, tetapi dengan normal peta: bitmap biasa yang mengkodekan normals bukan triplet RGB. Kemudian, untuk membuat benjolan peta, kita mengubah posisi cahaya untuk ruang tangen, seperti yang kita lakukan dengan embossing. Kemudian kita memiliki satu cahaya vektor untuk setiap titik di mesh. Untuk membuat segitiga, vektor cahaya untuk setiap satu dari tiga simpul diinterpolasi. Perhatikan bagaimana ini bukan interpolasi warna tapi interpolasi vektor cahaya. kemudian, peta benjolan dikombinasikan dengan nilai cahaya diinterpolasi untuk pixel diberikan. Ini dikombinasikan dengan produk dot seperti dalam persamaan Lambert klasik. Produk dot diimplementasikan sebagai fungsi campuran tekstur khusus.

Berikut adalah contoh kode untuk melakukan pemetaan Dot3 benjolan di Direct3D 9:
// we compute a light vector
D3DXVECTOR3 m_vLight;
point p(0.5,1,0.5);
p.normalize();
m_vLight[0]=p.x;
m_vLight[1]=p.y;
m_vLight[2]=p.z;
// encode the vector into a double word
DWORD dwFactor = VectortoRGBA( &m_vLight, 10.0f );
// set the computed factor so the texture unit uses it
d3d_device->SetRenderState( D3DRS_TEXTUREFACTOR, dwFactor );
// set the texture (here goes the normal map)
texture->activate(0);
// operation: dot3
d3d_device->SetTextureStageState(0,D3DTSS_COLOROP,
D3DTOP_DOTPRODUCT3);
// first argument: the normal map
d3d_device->SetTextureStageState(0,D3DTSS_COLORARG1,
D3DTA_TEXTURE);
// second argument: the factor
d3d_device->SetTextureStageState(0,D3DTSS_COLORARG2,
D3DTA_TFACTOR);

Dot3 pemetaan benjolan memiliki keuntungan lebih embossing  yang hasilnya terlihat sangat baik. Selain itu, Dot3 dapat menangani specular highlights pada peta benjolan, sedangkan emboss hanya mendukung difus komponen pencahayaan. Selain itu, kode ini sangat sederhana.

MIPMAPPING

Terkadang, khusus untuk objek yang letaknya jauh, anda akan melihat teksturnya berkerlap-kerlip,  dengan gerakan-gerakan kecil pada kamera maka menjadi terlihat aneh. Sebagaimana dibahas sebelumnya,  tekstur peta-peta harus  disaring, sehingga setiap pixel diberikan sebuah nilai yang ditambahkan texel-textel yang terdekat ke nilai yang diinginkan. Tapi apa yang terjadi ketika kita sangat jauh dari objek? Jawabannya adalah bahwa proyeksi Texel adalah jauh lebih kecil dari ukuran sebuah pixel, sehingga pencampuran empat nilai tidak cukup. Dalam hal ini, sedikit gerakan dalam kamera akan menghasilkan sebuah gerakan cepat per-pixel pada ruang tekstur. Hal ini menyebabkan tekstur ditempatkan pada obyek yang jauh untuk berkerlip dan menghasilkan efek yang menggangu.  Mari kita memvisualisasikan ini dengan sebuah sampel, seperti paralel yang terletak sangat jauh ke layar.  Satu pixel memiliki koordinat tekstur (0,5, 0,5), sedangkan yang lainnya,  arah tidak ditentukan,  dipetakan ke (0,65, 0,5).  Perbedaan koordinat berasal dari fakta sejauh ini, koordinat terpisah jauh didalam ruang tekstur.  Kemudian, dengan asumsi peta adalah 256 x 256,  pixel pertama dipetakan ke Texel (128, 128) ditambah interpolasi. Yang kedua dipetakan ke Texel (166, 0,5).  Jelas,  ada sebuah samudera antara kedua sampel.  Setiap gerakan kamera yang minimal akan membuat dampak yang besar 
dalam ruang tekstur dan menjadi terlihat berkerlap-kerlip. Lihat Gambar 18.3 untuk dua sampel.
Gambar 18.3. Gambar sebelah kiri menunjukkan gambar yang diberikan tekstur penyaringan,
sedangkan gambar sebelah kanan menunjukkan aplikasi yang sama yang dijalankan dengan penyaringan dinonaktifkan.

Solusi untuk masalah ini disebut mipmapping,  yang merupakan teknik penyaringan yang akan membuat tekstur  terlihat baik terlepas dari kejauhan. Mipmapping menghitung setiap masing-masing tekstur sebagai urutan memetakan setiap satu setengah ukuran dari sebelumnya. Jadi,  jika Anda mulai dengan peta tekstur  256 x 256, mipmaps Anda akan menjadi 128 x 128,  64 x 64,  32 x 32,  16 x 16,  dan sebagainya.  Peta-peta yang turun sampel dihitung dengan interpolasi texel-texel bersama-sama, sehingga mereka memberikan pengurangan detil halus untuk sejauh poligon . Kemudian, saat runtime,
tekstur untuk segitaga diproyeksikan di ruang layar, dan bidang mipmap yang sesuai dengan daerah segitiga lebih baik digunakan. Dengan cara ini kita dapat menghilangkan berkerlap-kerlip (pada biaya penggunaan memori tekstur tambahan). Meninjau contoh kita sebelumnya, bayangkan bahwa kami ditugaskan untuk letak mipmap dalam ukuran 8x8 piksel. Kemudian, pixel pertama, dengan koordinat (0,5, 0,5), akan dipetakan ke Texel (4,4). Pixel kedua,
dipetakan dengan (0,65, 0,5) sebagai koordinat, akan pergi ke Texel (5,2, 4), yang berdekatan dengan Texel sebelumnya.

Mipmaps dapat dihitung secara otomatis di kedua OpenGL dan DirectX. Di bawah OpenGL, mereka diciptakan dengan
panggilan:

gluBuild2Dmipmaps

Sintaks ini adalah panggilan yang sangat mirip dengan glTexImage2D, panggilan standar untuk mendefinisikan dan melewati tekstur ke OpenGL. Kemudian, seleksi mipmap adalah proses otomatis. Di bawah DirectX, mipmaps ditangani melalui GenerateMipSubLevels disebut milik antarmuka IDirect3Dtexture9. Atau, mipmaps dapat dihasilkan secara otomatis pada penciptaan tekstur jika kita lulus konstan D3DUSAGE_AUTOGENMIPMAP dalam penggunaan parameter panggilan CreateTexture.