Bagikan melalui


Pencahayaan Spekular (Direct3D 9)

Pemodelan pantulan spekular mengharuskan sistem tidak hanya tahu dalam cahaya arah apa yang bepergian, tetapi juga arah ke mata penonton. Sistem ini menggunakan versi model pantulan spekular Phong yang disederhanakan, yang menggunakan vektor setengah jalan untuk mempertanyakan intensitas refleksi spekular.

Status pencahayaan default tidak menghitung sorotan spekular. Untuk mengaktifkan pencahayaan spekular, pastikan untuk mengatur D3DRS_SPECULARENABLE ke TRUE.

Persamaan Pencahayaan Spekular

Pencahayaan Spekular dijelaskan oleh persamaan berikut:

Pencahayaan Spekular = Cs * jumlah[Ls * (N ยท H)P * Atten * Spot]

 

Tabel berikut mengidentifikasi variabel, jenisnya, dan rentangnya.

Parameter Nilai default Jenis Deskripsi
Cs (0,0,0,0) D3DCOLORVALUE Warna spekular.
jumlah T/A T/A Penjumlahan komponen spekular setiap lampu.
N T/A D3DVECTOR Vertex normal.
H T/A D3DVECTOR Setengah jalan vektor. Lihat bagian di vektor setengah jalan.
P 0.0 FLOAT Kekuatan pantulan spekular. Rentang adalah 0 hingga +tak terbatas
Ls (0,0,0,0) D3DCOLORVALUE Warna spekular cahaya.
Atten T/A FLOAT Nilai redaman cahaya. Lihat Faktor Redaman dan Sorotan (Direct3D 9).
Spot T/A FLOAT Faktor sorotan. Lihat Faktor Redaman dan Sorotan (Direct3D 9).

 

Nilai untuk Cs adalah:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • vertex color1, jika sumber bahan spekular D3DMCS_COLOR1, dan warna puncak pertama disediakan dalam deklarasi puncak.
  • vertex color2, jika sumber bahan spekular D3DMCS_COLOR2, dan warna puncak kedua disediakan dalam deklarasi puncak.
  • warna spekular material

Catatan

Jika salah satu opsi sumber bahan spekular digunakan dan warna puncak tidak disediakan, maka warna spekular material digunakan.

 

Komponen spekular dijepit menjadi dari 0 hingga 255, setelah semua lampu diproses dan diinterpolasi secara terpisah.

Vektor Setengah Jalan

Vektor setengah jalan (H) ada di tengah antara dua vektor: vektor dari verteks objek ke sumber cahaya, dan vektor dari verteks objek ke posisi kamera. Direct3D menyediakan dua cara untuk menghitung vektor setengah jalan. Ketika D3DRS_LOCALVIEWER diatur ke TRUE, sistem menghitung vektor setengah jalan menggunakan posisi kamera dan posisi verteks, bersama dengan vektor arah lampu. Rumus berikut mengilustrasikan ini.

H = norm(norm(Cp - Vp) + Ldir)

 

Parameter Nilai default Jenis Deskripsi
Cp T/A D3DVECTOR Posisi kamera.
Vp T/A D3DVECTOR Posisi puncak.
L dir T/A D3DVECTOR Vektor arah dari posisi puncak ke posisi cahaya.

 

Menentukan vektor setengah jalan dengan cara ini dapat secara komputasi intensif. Sebagai alternatif, mengatur D3DRS_LOCALVIEWER = FALSE menginstruksikan sistem untuk bertindak seolah-olah titik pandang sangat jauh pada sumbu z. Ini tercermin dalam rumus berikut.

H = norm((0,0,1) + Ldir)

 

Pengaturan ini kurang intensif secara komputasi, tetapi jauh kurang akurat, sehingga paling baik digunakan oleh aplikasi yang menggunakan proyeksi ortogonal.

Contoh

Dalam contoh ini, objek diwarnai menggunakan warna cahaya spekular adegan dan warna spekular material. Kode ditunjukkan di bawah ini.

D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(mtrl) );

D3DLIGHT9 light;
ZeroMemory( &light, sizeof(light) );
light.Type = D3DLIGHT_DIRECTIONAL;

D3DXVECTOR3 vecDir;
vecDir = D3DXVECTOR3(0.5f, 0.0f, -0.5f);
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );

light.Specular.r = 1.0f;
light.Specular.g = 1.0f;
light.Specular.b = 1.0f;
light.Specular.a = 1.0f;

light.Range = 1000;
light.Falloff = 0;
light.Attenuation0 = 1;
light.Attenuation1 = 0;
light.Attenuation2 = 0;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );

mtrl.Specular.r = 0.5f;
mtrl.Specular.g = 0.5f;
mtrl.Specular.b = 0.5f;
mtrl.Specular.a = 0.5f;
mtrl.Power = 20;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);

Menurut persamaan, warna yang dihasilkan untuk simpul objek adalah kombinasi dari warna bahan dan warna terang.

Dua ilustrasi berikut menunjukkan warna bahan spekular, yaitu abu-abu, dan warna terang spekular, yang putih.

ilustrasi ilustrasi bola abu-abudari bola putih

Sorotan spekular yang dihasilkan diperlihatkan dalam ilustrasi berikut.

ilustrasi sorotan spekular

Menggabungkan sorotan spekular dengan pencahayaan sekitar dan difus menghasilkan ilustrasi berikut. Dengan ketiga jenis pencahayaan yang diterapkan, ini lebih jelas menyerupai objek realistis.

ilustrasi menggabungkan sorotan spekular, pencahayaan sekitar, dan pencahayaan difus

Pencahayaan spekular lebih intensif untuk dihitung daripada pencahayaan difus. Biasanya digunakan untuk memberikan petunjuk visual tentang bahan permukaan. Sorotan spekular bervariasi dalam ukuran dan warna dengan bahan permukaan.

Matematika Pencahayaan