共用方式為


反射光源 (Direct3D 9)

模型反射要求系統不僅知道光線在哪個方向行駛,而且知道觀眾的眼睛的方向。 該系統使用簡化版本的 Phong 反射模型,採用半途向量來近似反射強度。

預設光照狀態不會計算鏡面高光。 若要啟用反射光源,請務必將D3DRS_SPECULARENABLE設定為 true

反射光源方程式

反射光源是由下列方程式所描述:

鏡面反射光 = Cₛ * sum[Lₛ * (N · H)P * Atten * Spot]

 

下表會識別變數、其類型和範圍。

參數 預設值 類型 描述
Cs (0,0,0,0) D3DCOLORVALUE 鏡面色
N/A N/A 每個光線反射元件的加總。
N N/A D3DVECTOR 頂點正常。
H N/A D3DVECTOR 半程向量。 請參閱中途向量一節。
P 0.0 鏡面反射功率。 範圍是 0 到 +無限大
Ls (0,0,0,0) D3DCOLORVALUE 淺色反射色彩。
Atten N/A 光衰減值。 請參閱 衰減和聚光燈因數 (Direct3D 9)
N/A 焦點因素。 請參閱 衰減和聚光燈因數 (Direct3D 9)

 

Cs 的值可以是:

if(SPECULARMATERIALSOURCE == D3DMCS_COLOR1)
  C = color1;
  • 頂點色彩1,如果反射材質來源是D3DMCS_COLOR1,而且頂點宣告中會提供第一個頂點色彩。
  • 頂點色彩2,如果反射材質來源是D3DMCS_COLOR2,而頂點宣告中會提供第二個頂點色彩。
  • 材質反射色彩

注意

如果使用任一個反射材質來源選項,而且未提供頂點色彩,則會使用材質反射色彩。

 

鏡面反射分量會被限制在 0 到 255 的範圍,在所有光源分別經過處理和插值後。

中間向量

中間向量 (H) 存在於兩個向量之間:從物件頂點到光源的向量,以及從物件頂點到相機位置的向量。 Direct3D 提供兩種方式來計算中途向量。 當D3DRS_LOCALVIEWER設定為 TRUE時,系統會使用相機的位置和頂點的位置以及光線的方向向量來計算半途向量。 下列公式說明這一點。

H = norm(norm(Cp - Vp) + Ldir

 

參數 預設值 類型 描述
Cp N/A D3DVECTOR 相機位置。
Vp N/A D3DVECTOR 頂點位置。
Ldir N/A D3DVECTOR 從頂點位置到光線位置的方向向量。

 

以這種方式判斷中途向量可能需要大量運算。 或者,將 D3DRS_LOCALVIEWER 設定為 FALSE 會通知系統在 z 軸上如同視點無限遠一般運作。 這反映在下列公式中。

H = norm((0,0,1) + Ldir)

 

此設定的計算密集程度較低,但精確度較低,因此最適合使用正交投影的應用程式使用。

在此範例中,物件會使用場景反射淺色和材質反射色彩來著色。 程序代碼如下所示。

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);

根據方程式,物件頂點產生的色彩是材質色彩和淺色的組合。

以下兩幅插圖顯示了反射材質的顏色(灰色)和反射光的顏色(白色)。

灰色球體的圖例 白色球體的圖例

下例插圖顯示產生的鏡面高光。

鏡面高光的 圖例

將鏡面高光與環境光和漫射光結合後,產生以下示例圖。 套用這三種光源類型時,這更清楚地類似於現實物件。

結合鏡面高光、環境光源和擴散光源的 插圖

鏡面反射光源的計算比擴散光源更繁重。 它通常用來提供表面材質的視覺線索。 反射高光會隨著表面材質而在大小和顏色上有所不同。

光源 數學