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