yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2010-1-23, PM 9:46 星期六 文章主題: 3D遊戲程式設計入門第5章心得 |
|
|
前言:此乃補丁文。只講解心得,不提供完整教學,有興趣的人請自行購買此書。
代碼: | 書名:3D遊戲程式設計入門-使用DirectX 9.0實作
作者:Frank D. Luna
譯者:黃聖峰
出版社:博碩文化 |
光線
先說光線有三個成分:
Ambient -- 環境光。會使場中的物體都帶上這個光的顏色,即使不是被照射到的一面也會帶有這顏色。
Diffuse -- 擴散光。物體被照射到時會呈現的顏色。
Specular -- 反射光。物體被照射到時,於反射角可觀察到的顏色。基本上跟上面那個差不多,不過有角度的考量在裡面。
以上光線必須跟質料做搭配才是最後顯示的顏色。
比如說,你質料Ambient是紅的,但光線Ambient是藍的,那麼物體一樣顯示不了藍色光,所以就會變黑色的,看不見。
承上,如果質料Diffuse是紅的,光線Diffuse也是紅的,那麼雖然沒被照射到的地方會是黑的,但被照射到的面就會是紅色的。
總之,想讓物體顯示怎樣的顏色,除了要有那種顏色的光線外,也要有那種顏色的質料。
質料另外還有個Emissive成份,這個成份不管有沒有打光都會產生該顏色,有點像是自發光,不過並不會照出去到其他物體上面。
視窗與dx的互動設定
再來說一下視窗與dx的設定
基本上要做個dx的應用程式我們必須先用CreateWindow建立視窗
然後用CreateDevice去建立dx的device跟視窗做聯結
視窗的大小由下面這個函式中的width跟height來決定
代碼: | hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/); |
dx的緩衝區大小則是由D3DPRESENT_PARAMETERS結構的兩個屬性來決定:
代碼: | d3dpp.BackBufferWidth = width;
d3dpp.BackBufferHeight = height; |
不過呢,視窗大小跟緩衝區大小實際上是可以設成不一樣的
事實上,在這個範例中,它的大小也是有點差距的
CreateWindow裡的寬高是有考慮到標題列跟邊框的
而d3dpp裡的寬高則純粹是對應到client顯示區域
因此實際上它是有點被內縮了
不過不要緊,因為dx有自動縮放的功能
即使你視窗大小設( 100, 100 )而dx緩衝區設( 800, 800 )都是ok的
dx會自動縮小fit那個視窗client區域的大小,當然,精緻度會因縮小而提高
反過來如果是放大,那精緻度就會因而降低
另外,dx與視窗聯結的地方有兩個
第一是 代碼: | d3dpp.hDeviceWindow = hwnd; |
第二是 代碼: | hr = d3d9->CreateDevice(
D3DADAPTER_DEFAULT, // primary adapter
deviceType, // device type
hwnd, // window associated with device
vp, // vertex processing
&d3dpp, // present parameters
device); // return created device |
上面兩個的hwnd就是視窗的handle
基本上,我在我的電腦上測試時,兩者去其一沒有問題
可以把任一個設成0
當然兩個都設0的話鬼才知道dx要跟哪個視窗聯結
不過嘛,這只是我簡單測試沒問題,不確定其一設0在任何情況下都ok
所以大家還是乖乖把兩個都設成同樣的hwnd吧 |
|