標籤:c++ directx 遊戲開發 遊戲編程 龍書
這一章講的是光照。光照(lighting)是Direct3D中非常重要的概念,而與之相對應的是材質(material)的概念。如果沒有材質的話,那麼光照的作用也無法體現。
在較早一些的關於DirectX 9的編程入門書籍裡,一般是使用D3DLIGHT9結構體來建立一個光源,而用D3DMATERIAL9結構體來定義物體的材質。我們要做的就是一些很瑣碎的家務活,基本上就是建立這些結構體對象、設定其中的參數、啟用光照之類的,至於具體實現的細節就非吾等所需(和所能)操心的了。
不過在我們的“龍書”第二版中,我們是使用shader方法來進行光照處理的。這意味著這樣兩點內容:
1、 這裡面不會出現D3DLIGHT9和D3DMATERIAL9這兩個結構體。相反,我們將使用自己的變數或者結構體來實現D3DLIGHT9以及D3DMATERIAL9的功能。
2、 我們必須考慮實現光照的細節了。這意味著我們必須好好理解書上的理論知識,然後將公式用代碼錶示。不過從實際角度出發,我們只需要把常用的關於光照處理的.fx檔案儲存好、以供以後隨時查閱就OK 了。
另外這也讓我們能夠發揮自己的創造性了:比如說,後面我們會發現,至少有兩種不同的實現鏡面反射的方法。另外,還有一些特殊的渲染效果可以通過shader方法來實現,比如說卡通渲染風格。
下面就進入習題講解部分吧!
這一章的習題還是非常有意思的,也是我自我感覺非常滿意的一次。
習題1部分:
===============================================================================
這一道題引入了另一種實現鏡面反射的方面,我稱之為halfway方法,因為它使用的是一個halfway向量。這個方法個人感覺很好,在外部環境(模型)所有的參數保持不變的情況下,似乎這種方法竟然讓模型變得更光滑了!
閑話少說,我們來看看效果吧!這是書上講過的經典方法的效果:
而這個是halfway方法的效果:
可以看出來,halfway方法的效果更加細膩了,光線不再刺眼了!為了方便,我設定了一個切換功能,只要按下數字鍵1或者2,就可以在兩種鏡面反射方法之間進行切換,從而直觀地觀察到效果。
當然, 我不會忘了給你們代碼的:
習題1代碼
===============================================================================
習題2部分:
===============================================================================
這一道題又引入了一個令人興奮的話題:卡通風格渲染!當然,這裡能夠做到的很少,真實的卡通風格渲染不會這麼簡單。要實現那種輪廓分明、明暗變化快、純色為主的卡通風格渲染,我們要做的事情還有很多(而且本人還沒有學會)。不過這裡的函數貌似有點問題,而我訂購的實體書一直沒來貨,所以我只好將就將就了。
另外我好奇的是這個函數究竟怎麼使用。我的理解是將它作為最終像素的一個放縮因子使用的,不知道你們意下如何?
不管怎麼樣,還是看看效果吧!
下面的代碼的:
習題2
===============================================================================
習題3部分:
===============================================================================
這一道題很簡單,讓我們將書上的一個程式稍微進行變動,使得光源運動起來。這道題沒什麼可說的。
下面是代碼的:
習題3
===============================================================================
習題4部分:
===============================================================================
這一道題有點意思,讓我們在情境中同時設定兩個光源。本來我以為這個很簡單的, 但是我弄了一天的時間才弄好,摸爬滾打,最後發現最主要的錯誤還是在更新了technique後忘了進行設定了!
不過現在的代碼我覺得仍然有點缺陷,就是為了好玩,我讓使用者可以在三種模式之下進行切換:按0鍵是啟用第一個光源,按1鍵是啟用第二個光源,而按2鍵則是同時啟用兩個光源。然後我發現,要實現這樣的效果,好像必須寫3個techniques,分別對應這三種情況!我覺得這有點浪費了,不過也沒有想到更好的解決辦法。不知道讀者有沒有誰能夠提出更好的解決方案呢?
下面是程式運行時的:
仍然是代碼的:
習題4
===============================================================================
習題5部分:
===============================================================================
這一道題很簡單,其實書上最後一節已經把方法都告訴你了。我這裡就不貼圖了。下面把地址送上:
習題5
補充:雖然和第1題中的halfway方法一樣都是讓高亮部分更加柔和了,但是二者的區別還是蠻大的。
===============================================================================
習題6部分:
===============================================================================
這一道題說難不難,說簡單也不簡單,關鍵看你有沒有學過微積分了。學過的話一切都好說。不管怎麼樣,我已經比較輕鬆地實現了這個程式,效果還不錯!
另外,為了讓這個程式更加好玩,同時也為了更加方便地看到光與材質的相互作用,我增添了“調節光色”的功能:在程式運行時按住數字鍵1(2、3),同時按空格鍵/左Control鍵就可以對紅色(綠色、藍色)成分的取值進行上調/下調了!效果很炫啊,有木有!下面放幾張:
最後是代碼的:
習題答案6
===============================================================================
好啦,這一期就到此結束啦!
DirectX 9.0c遊戲開發手記之“龍書”第二版學習筆記之8: Chap10: Lighting