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.
Sorotan spekular yang dihasilkan diperlihatkan dalam ilustrasi berikut.
Menggabungkan sorotan spekular dengan pencahayaan sekitar dan difus menghasilkan ilustrasi berikut. Dengan ketiga jenis pencahayaan yang diterapkan, ini lebih jelas menyerupai objek realistis.
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.
Topik terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk