2.10.1
燈光與材質
在現實的世界裡,沒有光線,是什麼東西也看不見的。在d3d的世界裡,也是一樣的。但是在d3d裡有一種光線,是非常奇怪的,這種光線是沒有方向,沒有位置,整個世界全可以照亮的光線,它就是環境光,它其實有點像我們現實生活裡的無影燈。在d3d裡光線分為三種型別,分別是點光源、聚光燈和方向光。
材質就是說明物體是吸收什麼樣顏色的光線和反射什麼樣顏色的光線。在現實世界裡,看到各種各樣的物體,各色各樣的。同是太陽光照射下,看到花朵有紅色的,有白色的,有黃色的,還有粉紅色的。這種不同的顏色的表現,我們就說是它們的材質不同,也就是它們吸收光線和反射的光線不同。
在d3d裡有下面幾種光線型別:
typedef enum d3dlighttype
d3dlighttype, *lpd3dlighttype;
點光源
點光源是有位置和有顏色,但沒有單一方向,而是向四面八方向發出光線的光源。它有點像電燈泡一樣,向各個方向都發出光線。如下圖所示:
點光源的顯示,主要與點光源的位置和物體的頂點法線有關。通過點光源的位置與頂點的法線的夾角來計算表面的光照亮度,頂點的法線跟點光源夾角越小,就越亮。下面就是乙個點光源的例子顯示的圖:
在這個圖里,地板是有很多頂點連線的三角形組成,每個頂點的法線方向是垂直於地板。因此地板的亮度就是乙個中間亮,慢慢向四周減弱的過程。下面就仔細地看看怎麼實現點光源的顯示。
在d3d裡要表達光源,就得使用資料結構來表示,這是任何程式都缺少不了的。下面就是d3d裡用來表示光源的資料結構:
typedef struct d3dlight9 d3dlight9, *lpd3dlight;
在這個結構裡,
type是光源的型別,就是點光源、方向光和聚光燈。
diffuse是光源發出漫射光的顏色。
specular是光源發出鏡面反射光的顏色。
ambient是光源發出環境光的顏色。
position是光源的位置。方向光是沒有位置的。
direction是光源的方向。點光源是沒有方向的。這裡使用向量來表達光線的方向,向量可以不用規格化,但不能是零長度的向量。
range是光線的範圍,就是說在這個距離內的物體都能照亮,但方向光是沒有範圍的。並且這個距離的長度最大不能超過flt_max的平方根。
falloff是表示聚光燈的內心圈最亮點到外圈的衰減量。這個只能使用在聚光燈上。
attenuation0、attenuation1和attenuation2是用下面的公式來表達的:
atten = 1/( attenuation0+ attenuation1* d + attenuation2* d2)這三個係數表示光強度與距離的關係,attenuation0是恆定衰減量,attenuation1是定義線性衰減量,attenuation2是定義二次衰減量。很多時候,都是讓attenuation0等於0,attenuation1等於1,attenuation2等於0,這樣光強度就與距離d成反比了。
theta是聚光燈內光圈的角度。
phi是聚光燈外光圈的角度。
如下圖所示:
聚光燈
像汽車的遠光燈發出的燈光,就是聚光燈。它有位置、方向和顏色。下面的就是聚光的例子顯示的效果圖:
聚光燈比點光源多了方向,還多了內光圈和外光圈了的角度。因此,初始化燈光的結構時,就需要設定它們才能讓聚光燈有效裡顯示出來。程式初始化如下:
//
//初始化燈光。
//蔡軍生
2006/09/03
//void ccaispotlight::initlight(void)
上面首先設定地板的材料顏色,接著就初始化聚光燈的結構
m_ligthspot
,這裡選擇燈光型別為
d3dlight_spot
,顏色是白色。還設定了方向和位置,還有內圈的角度為
d3dx_pi/10
,而外圈的角度為
d3dx_pi/4
,從內光圈到外光圈衰減為3.0。
其它渲染部份,同點光源是一樣的。
3D遊戲從入門到精通 31
當我們看到現實世界裡,有很多山地。那麼這種山地,在 3d世界裡又是怎麼樣顯示出來的呢?要模擬現實中的山地,就需要研究它怎麼樣構成,然後採用各種方法建立出來。在遊戲的世界裡,對於地形的要求是不嚴謹的,只要看起來像山地,就行了,而不像其它地理系統,一定要精確到跟現實世界里山比例一樣。因此,在這裡建立的 ...
3D遊戲從入門到精通 11
2.10.1 索引緩衝區 上面已經學習了最簡單的三角形顯示,了解了整個3d物體的顯示流程,下面來學習乙個複雜一點的物體顯示,使用12個三角形構造成的正方體顯示。並且通過個例子學會使用索引緩衝區,提高圖形繪製的速度和效率。1 使用三角形構造立方體 由前面可知,任何複雜的物體,都是由三角形組成的。現在就...
3D遊戲從入門到精通 16
4 三角形帶列表 三角形顯示的方式總共分為三種,前面已經學習最多的是三角形列表,現在再來看看三角形帶列表是什麼樣的,這樣有什麼優點呢?這裡顯示圖形如下 上面的圖形可以看出,只有6個頂點就可以顯示4個三角形,而採用三角形列表的方式,只能顯示兩個三角形。因此採用這種方式就會大大提高渲染效率,減少占用記憶...