mDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
光照
DirectX中有四種光照模型:
環(huán)境光:環(huán)境光沒有方向和位置上的特征,只有一個顏色亮度值,不會衰減,所以在所有方向和所有物體表面投射的環(huán)境光的數(shù)量是恒定不變的。
漫反射:漫反射在生活中最為普遍,太陽光的直射,日光燈的照射都可以用漫反射光來模擬。漫反射由光的方向和物體表面的法向量決定。漫反射光的空間位置和方向?qū)ξ矬w的照明有很大的影響。
鏡面反射:當(dāng)觀察金屬制品和玻璃制品的表面時,改變觀察點(diǎn)的位置,會發(fā)現(xiàn)物體表面的亮度也會發(fā)生變化,這種現(xiàn)象稱之為鏡面反射。
自發(fā)光:就是物體自身發(fā)光,通過設(shè)置材質(zhì)的自發(fā)光屬性Emissive(顏色和透明度)來實(shí)現(xiàn)。自發(fā)光可以影響一個對象的顏色。可以使用材質(zhì)的自發(fā)光來實(shí)現(xiàn)發(fā)光的對象,而不用在場景中添加燈光,減少了計算量。
用自發(fā)光屬性創(chuàng)建的材質(zhì)并不發(fā)射能被場景中其他物體反射的光,也就是說自發(fā)光不參與光照計算。
有三種光源
點(diǎn)光源:點(diǎn)光源有顏色和位置,但是沒有方向,它向所有方向發(fā)射的光都一樣。在程序中需要提供點(diǎn)光源的顏色,位置,衰減系數(shù)等參數(shù)。
電燈泡是點(diǎn)光源的一個例子。這種光的強(qiáng)度會隨著距離物體的遠(yuǎn)近而衰減。
方向光:只有方向和顏色屬性的光源,沒有位置,衰減。可以想象成從無窮遠(yuǎn)處發(fā)來的光,例如太陽光。
聚光燈:聚光燈有顏色,位置,方向,類似現(xiàn)實(shí)中的探照燈。聚光燈又一個明亮的內(nèi)椎體和大一點(diǎn)的外椎體組成。光的強(qiáng)度從內(nèi)椎體到外椎體逐漸衰減,衰減的規(guī)律由Falloff,Theta(內(nèi)錐角)和Phi(外錐角)三個屬性共同決定。
DirectX中物體的顏色由光的顏色和材質(zhì)的顏色共同決定(和現(xiàn)實(shí)世界情況不同)。
默認(rèn)情況下,D3D中的燈光是開啟的,就是說寫:
mDevice->Set

RenderState(D3DRS_LIGHTING, TRUE);
和忽略這一句效果一樣。
如果要禁用燈光,就將這句代碼中的TRUE改為FALSE。
1 mDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
如果禁用燈光,那么任何的材質(zhì)設(shè)置都不會有效果。
2 mDevice->SetRenderState(D3DRS_AMBIENT, 0xffffffff);
關(guān)于這兩句代碼(編號為1和2),又有幾種情況:
1)1為FALSE時,啟用2,那么會獲得一個環(huán)境光照明,此時設(shè)置材質(zhì)無效(渲染對象為白色),紋理可以正常顯示(如果有紋理)。
2)1為TRUE時,啟用2,材質(zhì)設(shè)置有效,會影響渲染結(jié)果,紋理可以正常顯示。
3)1為FALSE時,禁用2,材質(zhì)設(shè)置失效,紋理可以正常顯示。
4)1為TRUE時,禁用2,材質(zhì)設(shè)置失效,紋理無法顯示(渲染對象為黑色)。
P.S.以上所說的材質(zhì)指的是D3DMATERIAL9,不包括頂點(diǎn)色。帶有頂點(diǎn)色時,1為TRUE時渲染為黑色,F(xiàn)ALSE時為正常,和2的狀態(tài)無關(guān)。
結(jié)論:當(dāng)開啟光照時,必須指定一種光源才能使渲染對象正確繪制(渲染狀態(tài)設(shè)置的環(huán)境光或者其他3種類型的光源)。