燈光和材料(Direct3D 9)
燈光可用來照亮場景中的物件。 啟用光源時,Direct3D 會根據下列組合計算每個物件頂點的色彩:
注意
本節僅適用於固定函式管線。 可程式化著色器會明確執行所有光源。
- 目前材質色彩和相關聯紋理地圖中的紋素。
- 如果指定,則為頂點的擴散和反射色彩。
- 場景中光源或場景環境光線等級所產生的光線色彩和強度。
當您使用 Direct3D 光源和材質時,允許 Direct3D 為您處理照明的詳細數據。 如有需要,進階使用者可以自行執行光源。
您如何使用光源和材質,在呈現的場景外觀上有很大的差異。 材質會定義光線如何從表面反射。 直接光線和環境光線等級會定義反射的光線。 如果已啟用光源,您必須使用材質來轉譯場景。 不需要光線來轉譯場景,但未顯示光線的情況下呈現場景中的詳細數據。 最多轉譯未點亮的場景會導致場景中物件的剪影。 對於大部分用途而言,這還不夠詳細。
直接光線與環境光線
雖然直接和環境光線都會照亮場景中的物件,但它們彼此獨立,但效果非常不同,而且它們要求您以完全不同的方式與他們合作。
直接光線就是:直接。 直接光線一律具有方向和色彩,而且它是陰影演算法的一個因素,例如 Gouraud 陰影。 不同類型的燈光會以不同方式發出直接光線,產生特殊的衰減效果。 您可以呼叫 IDirect3DDevice9::SetLight 方法來建立一組直接光線參數。
環境光線實際上在場景中隨處可見。 您可以將它視為填滿整個場景的一般光線層級,而不論物件及其在該場景中的位置為何。 環境光線沒有位置或方向,只有色彩和強度。 每個光線都會新增至場景中的整體環境光線。 使用呼叫 IDirect3DDevice9::SetRenderState 方法設定環境光線層級,將D3DRS_AMBIENT指定為 State 參數,並將所需的 RGBA 色彩指定為 Value 參數。
環境光線色彩採用 RGBA 值的形式,其中每個元件都是從 0 到 255 的整數值。 這與 Direct3D 中的大多數色彩值不同。
您可以使用 D3DCOLOR_RGBA 巨集來產生 RGBA 值。 紅色、綠色和藍色元件結合,使環境光線的最終色彩。 Alpha 元件會控制色彩的透明度。 使用硬體加速或 RGB 模擬時,會忽略 Alpha 元件。
Direct3D 光模型與自然
在本質上,當光線從來源發出時,它會從數百個物件中反射出來,如果不是數千個或數百萬個物件,然後才到達使用者的眼睛。 每次反射時,一些光線被表面吸收,有的分散在隨機方向,其餘部分則移至另一個表面或使用者的眼睛。 此程式會繼續進行,直到光線減少為無所獲,或使用者察覺光線為止。
顯然,完美模擬光線自然行為所需的計算太耗時,無法用於即時 Direct3D 圖形。 因此,考慮到速度,Direct3D 光模型會近似自然世界中光線的運作方式。 Direct3D 描述結合以建立最終色彩的紅色、綠色和藍色元件來表示光線。
在 Direct3D 中,當光線從表面反射時,淺色會以數學方式與表面本身互動,以建立最終顯示在螢幕上的色彩。 如需 Direct3D 使用演算法的特定資訊,請參閱 光源數學 (Direct3D 9)。
Direct3D 光線模型會將光線一般化為兩種類型:環境光線和直接光線。 每個都有不同的屬性,而且每個屬性都會以不同的方式與表面材質互動。 環境光線是分散的光線,以至於其方向和來源不確定:它在任何地方保持低濃度。 攝影師使用的間接光源是環境光線的良好範例。 Direct3D 中的環境光線與自然一樣,沒有真正的方向或來源,只有色彩和強度。 事實上,環境光線等級完全獨立於產生光線的場景中的任何物件。 環境光線不會對反射造成貢獻。
直接光線是場景中來源所產生的光線;它一律具有色彩和強度,而且會以指定的方向移動。 直接光線會與表面材質互動,以建立反射醒目提示,其方向會作為陰影演算法的一個因素,包括 Gouraud 底紋。 當直接光線反射時,它不會對場景中的環境光線水準造成貢獻。 產生直接光線的場景中的來源具有不同特性,會影響其照亮場景的方式。
此外,多邊形材質的屬性會影響該多邊形如何反映其接收的光線。 您可以設定單一反射特徵,描述材質如何反映環境光線,並設定個別特徵來判斷材質的反射和擴散反射。 如需詳細資訊,請參閱 材質 (Direct3D 9)。
光源和材質的色彩值
Direct3D 描述四個元件-紅色、綠色、藍色和 Alpha 結合的色彩,以製作最終色彩。 D3DCOLORVALUE C++ 結構會定義為包含每個元件的值。 每個成員都是浮點值,通常範圍從 0.0 到 1.0,包含。 雖然燈光和材質都使用相同的結構來描述色彩,但結構中的值會以稍微不同的方式使用。
光源的色彩值代表它發出之特定光線元件的數量。 因為燈光不會使用 Alpha 元件,因此只有色彩的紅色、綠色和藍色元件是相關的。 您可以將這三個元件可視化為投影電視上的紅色、綠色和藍色鏡頭。 每個鏡頭可能會關閉(適當成員中的 0.0 值),可能盡可能明亮(1.0 值),或者可能是介於兩者之間的某個層級。 通過鏡頭的色彩結合,使光線的最終色彩。 R(1.0)、G(1.0)、B(1.0)等組合會產生白色光,R(0.0)、G(0.0)、B(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)的材料反映了所有針對它的綠燈。 材質有多個反射值,可建立各種類型的效果。
其他資訊包含在:光類型(Direct3D 9),以及 光屬性(Direct3D 9)。
相關主題