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.
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.
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.