友情提示:
本人第一次嘗試翻譯,圖形學也涉獵粗淺,有些專業名詞和通用名詞也許使用不當,請謹慎參考。水平有限,若有錯誤,不吝賜教。
Lightand Materials ( Direct3D 9)
光照和材质
光照用于照亮场景中的物体。当Direct3D光照被启用的情况下,Direct3D通过以下三点来计算每个物体的顶点颜色:
* 当前物体的材质和贴图映射的像素元(texels)
* 顶点中的漫反射颜色和镜面反射颜色(如果含有)
* 场景中光源的光照颜色和密度(intensity),以及环境光
當你啟用Direct3D內部提供的光照和材質機制時,Direct3D將會自動為你去處理場景中物體照亮時的細節。高級用戶會使用自己的光照機制(譯:比如光照貼圖,以及使用著色器自己計算獲得特殊的光照效果等等)
場景渲染后的表現會因不同的光照和不同的材質處理方式產生很大的差別。材質定義了到達物體表面的光照如何被反射。方向光源和環境光則定義了光照(顏色)屬性。如果Direct3D的光照被啟用,則需要定義物體的(譯:一般是在頂點定義中)材質,場景中的物體才會被點亮。在渲染過程中,光照不是必須的,但場景的細節如果沒有光照的介入則無法表現。在沒有光照介入的渲染場景中被渲染出來的物體至多也就只能渲染出物體的輪廓而已(譯:比如自行給每個物體的頂點設置顏色)。但這樣的細節表現在大部份情況下是完全不夠的。
DirectLight vs. Ambient Light
方向光(DirectLight) vs 環境光
雖然方向光和環境光都能照亮渲染場景中的物體,但它們是相互彼此獨立的,並且產生的效果也是不同的,並且在如何處理和對待它們的方式上也是完全不同的。
方向光就是:它是有方向的。方向光具有方向和顏色,這些都是著色算法所需要使用的因子,比如Gouraud著色。不同類型的光源才是以不同的方式產生不同的方向光,並且有著各自特殊的衰減效果。可填充D3DLight9參數,并使用IDirect3DDevice9::SetLight方法設置方向光。
環境光就是指在場景中的物體都會受其影響的光。環境光對場景中物體的光照效果不因物體的在場景中的位置以及其朝向而異。環境光沒有自己的位置和光照朝向,只有顏色和密度屬性。每個環境光都直接疊加到場景中全局環境光之中。使用IDirect3DDevice9::SetRenderState來設置環境光,State參數設置為D3DRS_AMBIENT,使用RGBA來設置Value參數。
表示環境光的RGBA(DWORD)值使用0~225來表示每個顏色分量,區別于Direct3D中大部份情況下表示顏色的方式。
你可以使用宏D3DCOLOR_RGBA來生產RGBA值。通過組合R, G, B三個顏色分量來獲取最終的環境光顏色。Alpha分量用來控制顏色的透明度。當使用硬件加速或者RGB模擬的時候,alpha分量被無視 ~
Direct3DLight Model vs. Nature
Direct3D中的光 vs自然界中的光
在自然界中,一個光源所發射出來的光照,在到達人類眼球之前,可能已經被成百上千甚至上百萬個物體所反射了。每次被反射,光照要么被物體表面吸收,要么被重新反射到其他各個方向,要么被反射到其他的物體表面或者人類眼球。這種過程一直持續知道光源消失或者光源被發現。
顯然,對於D3D的實時圖形應用程序而言,完全的去模擬自然界中的光照在計算的數量級實現上是不現實的。所以,出於速度的考慮,D3D的光照模型模擬出了自然界中的光照表現形式。D3D使用R, G, B三個分量組合顏色。
在D3D中,當光照到達物體表面時,結合光源的屬性(如顏色和反向)和物體表面的屬性,通過數學計算的方法得到最終的物體表面的反射結果(在顯示器中的表現顏色)。更多關於D3D算法信息可以參看Mathematics of Lighting(Direct3D 9)
D3D的光照模型可概括為兩類:環境光和方向光。它們有著不同的屬性,並且和物體表面材質有著不同的交互方式。環境光沒有光源位置一說,並且往所有方向發散:維持著全場景低密度的光照(級別)。類似攝影師使用的間接照明技巧。就如自然界中,環境光沒有方向沒有源頭,只有顏色和密度。實際上意思就是環境光獨立於場景中任何其他的光源。並且,環境光不參與鏡面反射的計算。
方向光是產生自場景中的一個光源;它不僅有顏色和密度,還有特定的傳播方向。方向光可與物體表面材質交互產生鏡面反射,方向屬性可用於著色計算因子,如Gouraud著色。當方向光被反射時,它不影場景中的環境光。場景中不同的光源產生的不同的方向光有著不同的特性,所以在照亮場景上也有著不同的表現。
另外,一個多邊形的材質屬性決定了光照到達多邊形表面時的反射結果。在材質屬性中,可以設置一個單獨的特徵來描述怎樣反射環境光,可以設置單獨的特徵來描述如何反射鏡面光或者漫反射。更多信息,可參考 Materials(Direct3D 9)
ColorValues for Lights and Materials
光照和材質的顏色
D3D使用red,green,blue和alpha四個分量組合來描述一個顏色。C++中定義了結構體D3DCOLORVALUE用來包含了這些分量。這四個分量都是float-point類型,範圍是0.0~0.1的閉合區間。雖然光照和材質都使用了相同的顏色結構體來描述顏色,但它們在取值方式上會有所不同。
對於光源而言,每個顏色分量值的大小表示其每個顏色分量所表現的明暗強度。由於光源不使用alpha分量,所以只有red,green,blue三個分量對其有意義。可以把這三個分量看成投影儀上分別為red,green,blue的三個投射鏡片。每個鏡片都可以被關閉(分量為0.0)或者被完全打開(分量為1.0)或者是明暗度在0.0和1.0之間的值。三個鏡片發出的顏色一起組合成了最終顏色。R(1.0)G(1.0)B(1.0)組合成白光,R(0.0)G(0.0)B(0.0)表示沒有光線發出。也可以發出只有一個分量非0值的光線,如紅光,綠光,藍光;或者只組合其中兩個為非零或者其他組合方式。甚至,可以設置光線顏色值為負數來製作一個“負光”用來降低場景中光照的強度。又或者,可以設置光照分量大於1.0來表示一個很強烈的光照。
然而當顏色用於材質時,則其顏色分量所定義的是當光照到達其所在表面時反射的顏色的多少。材質顏色屬性為R(1.0)G(1.0)B(1.0)A(1.0)表示它完全反射所有到達其表面的光線。同理,材質顏色屬性為R(0.0)G(1.0)B(0.0)A(1.0)則僅僅反射綠光。不同的材質顏色屬性產生不同的光照效果。
其他信息可參看: Light Types(Direct3D 9) and Light Properties(Direct3D 9)