DirectX 9.0c遊戲開發手記之“龍書”第二版學習筆記之10: Chap12: Blending


        這一章講的是Blending,包括alpha 混合和alpha 測試兩個方面。這一章的內容總體來說比較簡單。然而,後面的習題卻並不是很簡單……

 

        下面是習題解答部分:

 

 

習題1部分:

===============================================================================

        這道題讓我們研究使用不同的blend factor和blendop所產生的效果。這個實現起來不難,我就不打算詳細解釋了,大家都能夠看懂的。另外,爲了簡單,我就不研究除了+以外的blendop了。下面是幾張運行時候的截圖:










 

        此外,本題還讓我們研究D3DRS_COLORWRITEENABLE 渲染狀態。這個實現起來也很容易。不過我無法理解的是,這個到底有什麼用?如果將該狀態設爲D3DCOLORWRITEENABLE_GREEN 的話,按照書上說的,只會渲染到綠色通道,但是實際運行的時候是這個樣子的:



也就是說,顯示出來的圖形的顏色是紅色和藍色的混合色!這個是什麼情況?誰能夠解釋一下呢?多謝啦!


        下面是代碼的下載地址:

習題1答案下載地址

 

===============================================================================

 

習題2部分:

===============================================================================

        這道題讓我們在書中給出的Transparent Teapot Demo的基礎上進行一個小小的改動,具體來說就是先畫茶壺,後畫板條箱,並讓我們說明結果。


        結果如下圖所示:



        也就是說,雖然茶壺看上去是透明的,但是隻是對背景(爲了看到這一點,我特地改變了背景顏色)透明,而對於板條箱(以及其他任何在茶壺後面進行繪製的不透明物體)而言卻是不透明的。這樣的結果應該不是很出人意料。相信大家讀過本章內容之後,能夠明白產生這種現象的原因了吧!


        這題太過於簡單了,所以就不給代碼了。

===============================================================================

 

 

習題3部分:

===============================================================================

        這道題目引入了一個multi-pass技術,讓我們通過這種方法來獲得上一章中的多重紋理示例程序的效果。

        雖然作者解釋得貌似比較清楚了,但是實現起來可一點也不簡單!看樣子似乎只需要改動.fx文件就OK了,是嗎?

        然而你太小瞧了這道題了!要知道,這一章用的是alpha blending的技術,顧名思義,就要利用alpha 通道來完成混合的效果!可是我們這個上一章中給出的多重紋理示例使用的是RGB顏色來管理相應的紋理!雖然在blend factor中有跟顏色有關的,但是好像並沒有具體到某個顏色分量的那種!

        不過前面不是說了有D3DRS_COLORWRITEENABLE渲染狀態呀!我們何不試一下呢?

        可惜的是,各種嘗試都無果,不管是改變blend factor 還是使用D3DRS_COLORWRITEENABLE 渲染狀態,得到的效果都不行。實際上,用頭腦想想,就會發現這個效果用multi-pass技術幾乎是不可能實現的!


        真的是這樣嗎?有沒有高人來指點迷津呢?

 

        下面是不完美的代碼的下載地址,僅供拍磚:

不完美的習題3答案下載地址

 

===============================================================================

 

 

習題4部分:

===============================================================================

        這裏又引入了一個新技術,叫做廣告牌技術(billboardingtechnique),在3D遊戲編程中也是很重要的一種技術,可以有效地降低電腦資源的損耗(當然代價就是模型不夠逼真)。並且,由於用的是shader方法,所以可以通過一點手段減小繪製函數調用的開銷。

        這裏面的技術實現部分題目中已經給出來了(不過沒有增添光照。所以我在代碼中增添了光照。不過好像反光太強烈了)。不過有個地方值得注意:完全按照上面的方法會看不到圖形。後來發現在cross函數的調用前面加上一個負號就行了。下面是程序運行時候的截圖:



        本來打算用某種比較高端的方法讓整個地圖隨機分佈着這樣的樹的,不過後來太難了,簡直沒有思路(我希望這種隨機分佈首先在大尺度範圍上要足夠均勻,其次要能夠根據地圖的長和寬而進行調整),所以現在基本就是指定一些地方“栽樹”了。

        下面是代碼下載的地址:

習題4答案下載地址

===============================================================================

 

        好了,這第12章就結束了,下一期要講第14章了。第13章感覺有點太難了,想等以後琢磨透了再說不遲。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章