光照就是通過計(jì)算讓面對以及靠近光源的三角形看起來比較亮。正對光源的三角形可以反射出比較強(qiáng)的光線,而比較靠近光源的物體,光線的衰減程度會(huì)比較低。
在Fixed Function Pipeline中,光照都是在模型的頂點(diǎn)上計(jì)算的,再通過內(nèi)插把光照結(jié)果散播到三角形內(nèi)部,這種以頂點(diǎn)為單位來計(jì)算的方法叫做per-vertex lighting。如果使用Shader就可以把光照計(jì)算放到像素中去做,這樣可以得到比較精確的光照結(jié)果,這種方法叫per-pixel lighting。
Normal,即法線,用來指定模型上每個(gè)頂點(diǎn)所面對的方向。
在Fixed Function Pipeline中支持四種不同的光源:方向光(Directional Light)、電光源(Point Light)、聚光燈(Spot Light)、環(huán)境光(Ambient Light)。
方向光(Directional Light),只有方向和顏色屬性的光源,長用來模擬太陽。不具有位置屬性,無法計(jì)算出光源隨距離的衰減值,被定義成與距離無關(guān)。
點(diǎn)光源(point Light),具有位置和顏色的屬性,在空間中占據(jù)一個(gè)點(diǎn),并向四面八方散射。光線照到某個(gè)物體后,反射光的強(qiáng)度與物體表面的法線和入射光線的夾角有關(guān)。光源隨著到物體的距離增大而衰減。
聚光燈(Spot Light),具有方向、位置、顏色這些屬性,還需要指定光柱圓錐的發(fā)射角度。落在光柱中偏外側(cè)的物體所得到的光線強(qiáng)度會(huì)比較弱,完全落在光柱外的物體接受不到光線。光線會(huì)隨著距離的增大而衰減,反射強(qiáng)度會(huì)隨著光線入射角的改變而改變。
環(huán)境光(Ambient Light),沒有位置,沒有方向,僅僅提供一個(gè)基本的光源強(qiáng)度。環(huán)境光用來模擬通過反射得到的間接光源,否則有些物體可能會(huì)因?yàn)樘刀床坏健?/div>
在3D繪圖中通過反射所得到的光源稱為Global Illumination;不是通過反射,而是直接照射的光源稱為Direct Illumination。Ambient Light是解決Global Illumination的最簡單方法。Directional、Point、Spot照射得到的光是Direct Illumination。
Directional、Point、Spot照射到得物體表面會(huì)吸收到部分光線,也會(huì)反射部分光線。物體表面的紋理就是用來設(shè)置物體反射光線的能力。
物體表面的反射光有兩種。一種是Diffuse Light,它會(huì)均等的向四面八方反射出同樣強(qiáng)度的光線;另一種是Specular Light,它是物體表面直接反射的光線。反射光線是有方向的,如果鏡頭越接近反射后的光線路徑,那么就可以看到越強(qiáng)的Specular Light。
一個(gè)相當(dāng)重要而且很簡單的觀念,光源強(qiáng)度是可以累加的??梢韵扔?jì)算第1個(gè)光源的結(jié)果,再把第2個(gè)、第3個(gè)、...... 、第n個(gè)光源的強(qiáng)度累加上去。
光線衰減公式:1/(a*1 + b*d +c*d*d)
// vDistance用來計(jì)算光線隨距離衰減公式中分母的(1, d, d*d)
Vector4 vDistance(1.0f, light_distance, light_distance*light_distance);
// g_vLightAttenuation里記錄了計(jì)算衰減公式中分母的(a,b,c)
g_vLightAttenuation.Set(1.0f. 1.0f, 0.0f);
// Vector3Dot(vDistance, g_vLightAttenuation) = (1,d,d*d) dot (a,b,c) = (a*1 + b*d + c*d*d)
Vector4 vAttenuation = Vector3Dot(vDistance, g_vLightAttenuation);
----摘自《3D繪圖程序設(shè)計(jì)》
posted on 2010-03-01 22:51
郭小帥 閱讀(581)
評論(0) 編輯 收藏 引用 所屬分類:
Fixed Function Pipeline