Pencahayaan difus (Direct3D 9)
Setelah menyesuaikan intensitas cahaya untuk efek pelambatan apa pun, mesin pencahayaan menghitung berapa banyak cahaya yang tersisa memantul dari puncak, mengingat sudut puncak normal dan arah cahaya insiden. Mesin pencahayaan melompat ke langkah ini untuk lampu arah karena tidak mereda dari jarak jauh. Sistem mempertimbangkan dua jenis pantulan, difus dan spekular, dan menggunakan rumus yang berbeda untuk menentukan berapa banyak cahaya yang tercermin untuk masing-masing. Setelah menghitung jumlah cahaya yang tercermin, Direct3D menerapkan nilai baru ini ke sifat difus dan pantulan spekular dari bahan saat ini. Nilai warna yang dihasilkan adalah komponen difus dan spekular yang digunakan rasterizer untuk menghasilkan bayangan Gouraud dan penyorotan spekular.
Pencahayaan difus dijelaskan oleh persamaan berikut.
Pencahayaan Difus = jumlah[Cd*Ld*(N. Ldir)*Atten*Spot]
Parameter | Nilai default | Jenis | Deskripsi |
---|---|---|---|
jumlah | T/A | T/A | Penjumlahan setiap komponen difus lampu. |
Cd | (0,0,0,0) | D3DCOLORVALUE | Warna difus. |
Ld | (0,0,0,0) | D3DCOLORVALUE | Warna difus muda. |
N | T/A | D3DVECTOR | Puncak normal |
Dir L | T/A | D3DVECTOR | Vektor arah dari puncak objek ke cahaya. |
Diten | T/A | FLOAT | Redaman cahaya. Lihat Faktor Redaman dan Sorotan (Direct3D 9). |
Spot | T/A | FLOAT | Faktor sorotan. Lihat Faktor Redaman dan Sorotan (Direct3D 9). |
Nilai untuk Cd adalah:
- vertex color1, jika DIFFUSEMATERIALSOURCE = D3DMCS_COLOR1, dan warna puncak pertama disediakan dalam deklarasi puncak.
- vertex color2, jika DIFFUSEMATERIALSOURCE = D3DMCS_COLOR2, dan warna puncak kedua disediakan dalam deklarasi puncak.
- warna difus bahan
Catatan
Jika salah satu opsi DIFFUSEMATERIALSOURCE digunakan, dan warna puncak tidak disediakan, warna difus bahan digunakan.
Untuk menghitung redaman (Atten) atau karakteristik sorotan (Spot), lihat Attenuation and Spotlight Factor (Direct3D 9).
Komponen difus dijepit menjadi dari 0 hingga 255, setelah semua lampu diproses dan diinterpolasi secara terpisah. Nilai pencahayaan difus yang dihasilkan adalah kombinasi dari nilai cahaya sekitar, difus, dan emisi.
Contoh
Dalam contoh ini, objek diwarnai menggunakan warna difus cahaya dan warna difus 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 );
// set directional light diffuse color
light.Diffuse.r = 1.0f;
light.Diffuse.g = 1.0f;
light.Diffuse.b = 1.0f;
light.Diffuse.a = 1.0f;
m_pd3dDevice->SetLight( 0, &light );
m_pd3dDevice->LightEnable( 0, TRUE );
// if a material is used, SetRenderState must be used
// vertex color = light diffuse color * material diffuse color
mtrl.Diffuse.r = 0.75f;
mtrl.Diffuse.g = 0.0f;
mtrl.Diffuse.b = 0.0f;
mtrl.Diffuse.a = 0.0f;
m_pd3dDevice->SetMaterial( &mtrl );
m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
Menurut persamaan, warna yang dihasilkan untuk simpul objek adalah kombinasi dari warna bahan dan warna terang.
Dua ilustrasi berikut menunjukkan warna material, yaitu abu-abu, dan warna terang, yang berwarna merah cerah.
Adegan yang dihasilkan ditampilkan dalam ilustrasi berikut. Satu-satunya objek dalam adegan adalah bola. Perhitungan pencahayaan difus mengambil bahan dan warna difus ringan dan memodifikasinya dengan sudut antara arah cahaya dan verteks normal menggunakan produk titik. Akibatnya, bagian belakang bola menjadi lebih gelap saat permukaan bola melengkung jauh dari cahaya.
Menggabungkan pencahayaan difus dengan pencahayaan sekitar dari contoh sebelumnya menaungi seluruh permukaan objek. Cahaya sekitar menaungi seluruh permukaan dan cahaya difus membantu mengungkapkan bentuk 3D objek, seperti yang ditunjukkan dalam ilustrasi berikut.
Pencahayaan difus lebih intensif untuk dihitung daripada pencahayaan sekitar. Karena tergantung pada normal puncak dan arah cahaya, Anda dapat melihat geometri objek di ruang 3D, yang menghasilkan pencahayaan yang lebih realistis daripada pencahayaan sekitar. Anda dapat menggunakan sorotan spekular untuk mencapai tampilan yang lebih realistis.
Topik terkait