關於如何學好遊戲3D引擎編程的一些經驗

轉自OpenGPU論壇:http://www.opengpu.org/bbs/forum.php?mod=viewthread&tid=2202

 

《如何學好遊戲3D引擎編程》
此篇文章獻給那些爲了遊戲編程不怕困難的熱血青年,它的神祕要我永遠不間斷的去挑戰自我,超越自我,這樣才能攀登到遊戲技術的最高峯   
        ——阿哲VS自己 QQ79134054多希望大家一起交流與溝通
這篇文章是我一年半前,找工作時候寫的,那時是發到學校的BBS上。現在我工作了,想法和以前也有不同,但對遊戲引擎編程理念還是基本差不多。在我沒遇到U3以前,一直研究WILDMAGIC,可以說是GAMEBRYO的前身吧,他們基本框架都差不多,是完全面向對象,代碼容易讀,但它發展存在嚴重的弊端,這個也是它爲什麼不是牛B引擎的原因。但從渲染和動畫方面來看,U3的 MATERIAL TREE 和 ANIM TREEE 是2個飛躍的,當我對我自己引擎渲染材質和光照一籌莫展的時候,MATERIAL TREE帶來的希望。對比 zfx (wildmagic)gamebryo 和ogre 還有U3,各有優缺點,而且你可以看到一個引擎發展,從一個以多邊形爲渲染單元,變成以mesh做爲渲染單元(現在很少有引擎場景管理分割多邊形來做的 我始終喜歡zfx引擎,它是00-02之間的引擎,完全讓你可以理解那時候顯卡不是很強的時候,一個引擎應該具備的特徵。對於架構來講,(wildmagic)gamebryo 和ogre 做的很好,u3的特點就是架構亂,沒有什麼可讀性的技術文檔,研究起來十分吃力。做爲一個商業引擎,對於渲染方面,我認爲(wildmagic)gamebryo 輸給了ogre,框架設計還有弊端,ogre確實是一個好引擎。而U3對於渲染過程,光照,陰影,就是一幀的渲染過程,處理的十分得當。動態生成shader是一個引擎的發展的必然趨勢,而往往動態生成最多的,也就是材質和光照,它們不能分開,分開談無意義,MATERIAL TREE 我始終認爲是個太好的想法了,任何特效不需要程序員過多參與,美術可以搞定一切,什麼水,反射,折射,這些效果,編寫起來易如反掌,還可以實時光看效果。其他動態生成,也就是根據配置不同,來做處理,動態編譯shader弊端太大,不能做到所有,而且不靈活,如果動態生成和動態編譯合起來,簡直牛B透頂了。現在我的引擎已經有了MATERIAL TREE這個功能,ANIM TREEE在製作中。
這裏面我重點談的是圖形方面,略帶些動畫方面,一個引擎最基本的是內核,包含內存管理,文件讀寫,資源管理等等吧,也十分重要,我的引擎這些寫的都很簡單,基本都是wildmagic裏面的。
我總結3D引擎編程的4個階段
第一階段是瞭解3D原理和數學基礎,大學裏面學的線性代數,概率統計和高等數學完全足夠,在3D中都有充分體現。最好自己能做一個軟引擎,這樣整個3D流水線自己完全可以掌控,然後在學DX之類的API很容易。
第二階段不要看引擎,還是應該以實現各種效果和基本算法爲基礎,包括各種圖形特效,場景管理,剪裁算法,各種動畫算法,等等,所有那些單一的算法,如果這些都不是瞭解很好,那麼做引擎時引擎框架的接口也不會設計好!再添加這些算法和效果時 會很困難,效率也不會很高。
第三階段,就是看大量的引擎,對引擎有很深刻的概念,3D引擎只是引擎的一部分,引擎主要是框架,如果框架搭建好了,那麼引擎的效率是很顯著的,其他底層細節優化,也會有明顯的優勢體現。
第四階段,再好的引擎沒有成功的遊戲支撐都是白費,你不僅僅是做引擎,而是做的有開發價值的引擎,可以很好的爲遊戲服務的引擎。
下面這段話寫於一年半前~~


前言
本人不才,姑且以自己經驗來談如何學遊戲編程,這個話題我醞釀了很久,它確實很難寫,因爲我也不是資深高手,纔剛剛登堂入室,遊戲編程大師功力一般都十幾年左右,所以讓我這樣的小卒寫的深入淺出更何談容易,錯誤出現並不奇怪,高手見笑也在所難免,請大家指正,我會欣然笑納。但這幾年走過的路,讓我知道這麼學是正確的,大體過程經驗告訴我,這樣做是對的,高手的指引告訴我,這樣做是對的。
這篇文章主要討論如何學習遊戲圖形編程和遊戲引擎編程,告訴沒有接觸遊戲過編程或者現在關於怎麼學好遊戲編程還迷惑的PEOPLE所要走的方向,完全拋開技術和代碼實現進行談論。至於遊戲邏輯這幾年重點沒有發到這個上面上,很難總結。
經驗的限制,對於如何編寫一個好的引擎(至於“好”這個詞都是相對而言,能做的滿意就是我所期望的),至今爲止我還沒有這個能力,但我相信經過我的努力,不久的將來,我會實現這個願望,因爲我的一個願望就是實現一個好的引擎。

我從下面幾個方面來說明如果學習,記住只是如何學習,要想學好就要靠你自己。
1。 你真的喜歡遊戲編程嗎?
2。 要了解遊戲編程
3。 學會讀書,自學與思考,交流與合作
4。 遊戲編程需要的基礎知識
5。 2D遊戲編程
6。 3D遊戲編程
7。 遊戲引擎編程
8。淺談遊戲物理和AI


一。遊戲編程,你真的愛她嗎?
當你聽完我的介紹後,你就要決定遊戲編程是否適合你。
遊戲編程可簡單可複雜,簡單的2D 《蛇吃豆》,複雜的現在流行的3D遊戲。咱們不說簡單的,因爲你不想學習遊戲編程就爲了做一個簡單的遊戲。確實每個人對他所向往的東西都想徹底瞭解清楚,可是我給你的第一個警告,複雜的3D遊戲,複雜到難以想象。

1 你思想需要改變嗎?

打開話題,遊戲是一個結合體,她是一個音樂,美術,技術,創意相結合的藝術品,你要用藝術的眼光去欣賞的,因爲好的遊戲是用藝術的眼光來設計,除了某國的網遊不算外,很多經典的遊戲流芳百世,成爲真正遊戲玩家佳話。
中國的遊戲爲什麼這麼落後,你要聯想下,當年中國爲什麼會被八國聯軍所侵略。腐朽的思想是根本原因,從而導致了腐朽的社會制度。遊戲行業也是這樣,看待遊戲的中國人,始終帶着眼鏡,用腐朽思想看待遊戲,所以現在出現腐朽的遊戲行業,導致中國遊戲發展緩慢,有人曾經說中國遊戲不久就趕超日本和美國,我認爲是扯淡,而且不是一般的扯淡,具體原因後面我會詳細說明。
從小的時候,國外的電子遊戲產品就跑進了我的空間,廢寢忘食的玩個沒玩,因爲耽誤學習,從此電子遊戲被老師和家長全部封殺,任何事物都有利有弊,魯迅的《拿來主義》曾說過“去其糟粕,取其精華”。在中國,電子遊戲被視爲過街老鼠。確實要承認電子遊戲有負面影響,但這些負面影響是誰產生的,本質上是我們自己,最後本來是精華的東西從我們身邊擦肩而過,從小霸王以後的國外遊戲機沒有任何仿造,導致了遊戲機技術從此斷代,現在卻又想起來趕超。
而現在,國人知道努力了,國家看到有錢可賺開始支持了,腐朽的遊戲思想卻還在蔓延,網絡遊戲就是這樣環境下成長的新生兒,國內網絡遊戲每年要大批量生產,但存活的基本沒幾個。不能否定,沒有利益的事情沒人幹,但你還不能否定,有些事情即使沒有利益,但還是有人幹,哪怕知道自己並不能得到什麼。國內的人,很少是第2種人,他們把遊戲做爲賺錢工具,垃圾遊戲隔三差五的紛紛涌出。相比來講,我只拿日本舉例子,雖然小日本和咱們有愁,但我們不得不承認小日本在遊戲這方面思想層次完完全全超越我們,他們有嚴格遊戲教育背景,他們做一款遊戲,要按照嚴格的流程,從設計到編程,以至最後的測試,都有着幹一行敬一行的精神,否則《生化危機》這樣遊戲你是永遠看不到的。
所以你要改變自己的思想,遊戲是一種藝術品,你要有一種藝術境界來去欣賞她。

2 你有毅力愛她愛到底嗎?

也許我上面的話,你還能接受,殘酷的在下面,以我的經驗告訴我,如果你編程和遊戲理論起步是零,你要對遊戲編程達到略有小成的水平最少要4到5年,我比較蠢,花了6年。這6年來,幾乎每天平均學習4-5個小時左右,當然假期都要算上。頭3年半基本學習計算機基礎知識,包括數學,數據結構,計算機體系結構,人工智能,彙編,編譯原理,操作系統,網絡,軟件工程,離散數學,算法分析。我們大學4年基本就學這東西,這些都是基礎,遊戲編程都需要,還有一個就高等物理我沒有學,導致我現在對於一些物理微積分方程很難理解,當然這裏並不一定是問題,只要你肯努力,沒有學不會的。完全把這些學好,花4年時間真的不容易。我曾經抱怨自己沒保研而痛苦的經歷考研,現在我卻認爲是值得的,我很難有時間在集中精力的複習這些專業課了,尤其是數學。
在遊戲編程中,上面的基本知識都可以用到,所以我說遊戲編程很複雜一點不假。就拿遊戲中最難的部分——一個好的遊戲引擎來說(這裏說的好引擎),世界上能把她做出來的人很少,中國更是寥寥無幾。
上面只是理論基礎,要走進遊戲編程最基本的。過硬的編程技能更是需要的,其實這些理論學習可以和編程相結合,在編程中學習理論,爲了學習理論而增長編程經驗。
有了基礎,你才能進一步學習遊戲編程,2D遊戲和3D遊戲理論都要學,這又要花費很長時間,這個是我下面要詳細說的。
看完我寫的,你可能心驚膽寒,所以你要愛她,深深的愛她,否則你承受痛苦的時候享受不到暗含的樂趣。

3 愛她請從遊戲開始。

很多人可能不解,遊戲編程爲什麼要從遊戲開始,玩遊戲時,有很多潛移默化的東西影響着我們編寫遊戲程序,很多靈感確實從遊戲中得來。一般的遊戲編程高手,都是從小由於遊戲對他們巨大吸引,從而走上游戲道路,雖然不是絕對,但按統計學角度講可以說是一個事實。一個不愛玩遊戲的人,愛上游戲編程的機率是很小的。其實很多人小的時候都愛玩遊戲,他們都是從遊戲廳張大,只有一少部分,走向了遊戲開發這個行業,他們之間有着明顯不同,走向遊戲開發的人,是真的被遊戲背後那種神祕東西所吸引,並想要揭開它,而另一些人,則是完全迎合了遊戲開發的需要——玩的高興。
我想說的是,一個遊戲編程高手,必定是一個遊戲玩家,他們都是從玩遊戲而愛上游戲,從而走上游戲編程道路。這條路充滿了荊棘,不是一般人能走到最後的。所以你一定要愛她!
當然任何事情都不絕對的,你可能就是那不愛遊戲但愛遊戲編程(或者和遊戲性無關的那部分編程)小概率的人。

二。遊戲編程,你真的瞭解她嗎?

遊戲編程,這個概念包含了很多深層次的東西。

1.廣義上,我給的定義是,遊戲引擎開發和遊戲邏輯開發。

遊戲邏輯開發是集中力量只開發遊戲中劇情部分,你只需要做的是什麼時候顯示什麼,什麼時候放出什麼聲音,什麼時候通過網絡傳輸什麼數據,什麼時候這個物體或者人物做什麼動作。至於底層怎麼顯示,聲音如何處理,網絡如何傳輸,物體動作怎麼實現的,你不用關心,關心這些的是遊戲引擎。所以說遊戲引擎負責技術方面,而遊戲邏輯負責遊戲文化內涵。
成功的遊戲是以好的遊戲邏輯爲基礎的,而遊戲引擎並不是成功遊戲主要條件,但好的遊戲配上好的遊戲引擎,確實會給人一種震撼,相比同樣的遊戲邏輯,好的遊戲引擎顯示效果會給人一種全新視覺和聽覺感受。
至於遊戲邏輯我不想過多解釋,但並不是說遊戲邏輯簡單,遊戲邏輯也可以複雜的要命,這取決與遊戲複雜程度和遊戲引擎與這個遊戲的關聯程度。爲了解釋這句話,我不得不從遊戲引擎解釋開始。
早期的遊戲是沒有遊戲引擎這個概念,都是一個遊戲一套代碼,隨着遊戲越來越多,大家發現開發有些遊戲中,有很多可重用的代碼,逐漸把這些重用代碼封狀起來,這就是早期的引擎。對於引擎沒有明確的概念,只有好壞和適應程度之分,所謂的好壞,就是引擎支持功能和顯示特性等是否strong,而適應程度是指一個引擎是否適合開發這個遊戲,開發這個遊戲是否要自己再編寫一些額外的代碼。
我舉個例子
如果我用開發混鬥羅的引擎(假如它有引擎)來開發RPG,和開發RPG遊戲的“RPG遊戲開發大師”相比,我們還要做很多工作,才能完成玩法功能一樣的遊戲。
所以說很難有明確的界限劃分這一堆代碼是否是遊戲引擎,但遊戲引擎的任務是不用質疑的,它的任務就是儘量不用負責底層處理,而專心到遊戲邏輯上來。

2.從狹義上分,我只分解遊戲引擎部分,基本包括(1)遊戲圖形引擎(2)聲音引擎(3)網絡引擎(4)腳本引擎(5)GUI(6)人工智能引擎(7)物理引擎。

(6)(7)兩個不是必須的,而前5個是一個好的遊戲引擎要基本具備的,其實每個遊戲引擎中都具備物理引擎,只不過很多遊戲對於物理要求不是很高,所以就集成到了圖形引擎中或者遊戲邏輯中。
圖形引擎是引擎中最難的,它基本要處理遊戲引擎中70-80%的工作量,它的主要任務是負責圖形高效顯示,包括速度和精度。後面我會集中並詳細解釋。至於聲音和網絡引擎大家通過字面就可以知道它幹什麼。本人對聲音處理和網絡傳輸知道甚少,說出來只能誤人子弟。

至於腳本我還略有研究,我想解釋下什麼是腳本,遊戲中爲什麼用腳本。腳本有時很難給出一個定義,但大家都知道那些是腳本語言,我給出的解釋是用軟件CPU(虛擬CPU)來運行的編程語言就是腳本語言,軟件CPU和所說硬件CPU是對立的,也就是說腳本運行與否先是關聯到這個虛擬CPU,在虛擬CPU上運行,然後再又映射到真正CPU,來真正運行。這個過程很抽象,我覺2個例子,第一個就是JAVA語言,它有一個虛擬機,這個虛擬機就是軟件CPU。再舉一個例子,我現在要編寫這樣一個指令、
PRINT S  這個指令表示打印S
S代表一個萬能類型。
爲了實現這個指令,你首先要有一個函數來負責處理打印
比如是這樣的函數
void print(S)
{
    cout<<S;
}
這裏只是僞代碼,只是表示這個意思。
你首先要找出PRINT這個單詞,讀入到一個buffer1,然後把參數讀入buffer2
if(buffer1 == PRINT)
  print(buffer2);
這裏段代碼其實就是一個軟件CPU,它負責虛擬運行PRINT S  這個指令。

那麼遊戲中爲什麼要用腳本呢!最簡單解釋就是靈活性好。拿一個RPG遊戲例子來說,遊戲中有大量物品,每個物品有大量的屬性,如果我把這些屬性值直接寫到遊戲中,每一個小小的改變就要編譯整個遊戲,花費很多時間,靈活性很差。
如果我把這些寫到一個文件中,用腳本語言來編輯,只需要編譯腳本文件就可以了,當然如果你腳本是解釋型的語言,不用編譯直接可以運行。
當然腳本還有很多好處,主要目的還是方便性和靈活性。
其實GUI(圖形用戶接口)是一個重要部分。3D遊戲中,出現的是大量的3D模型,這些模型是先用文件的形式存放好的,而文件裏面包括的是3D數據和這些數據的組織方式。
至於數據怎麼組織是你引擎要規定好的,這樣也方便讀取,最後把3D數據加載到內存。現在問題是3D數據上,我們怎麼能有效的得到這些3D模型的數據,手工寫進文本里?我靠,那是奴隸社會,SB的做法。我想你不會這麼做。人類很聰明,這就是爲什麼人把其他動物關進籠子裏,而不是其他動物把人關進籠子裏的原因。既然我們很聰明,就要想一個辦法快速的定義3D數據,然後保存成文件。這樣一個3D編輯器就產生了。3D編輯器就是類似於3DMAX那種,但引擎中的編輯器是有特殊目的的,使用者要按照引擎指定要求編輯3D數據,這樣引擎高效的顯示和處理數據比較容易,至於3D數據是怎麼組織的,是一個設計上的問題,由你引擎來決定,設計好壞,決定你引擎加載數據是否容易,關係到最後渲染。所以一般好的遊戲引擎都有自己GUI,但你也可以用3DMAX這樣的軟件,然後讀3DMAX文件變成自己可以利用的數據形式。
說到這裏,不知道上面的概念大家是否理解,我想如果你沒接觸過引擎,可能真的不理解。其實我很難用簡短的語言把這麼複雜的問題說清楚,如果有一天你把3D學的融會貫通,你發現我說的是對的。我不知道大家是否發現一個共性的問題,有時你讀一本書,無論你怎麼認真把它看完一遍,你都很難掌握裏面的知識,當你再認真看第二遍的時候,你突然覺得這本書沒有第一次看那麼晦澀難懂。有些知識都是前後呼應的,它們之間相互聯繫,要想完整的理解它們缺一不可。遊戲編程的知識也是這樣。我前面介紹的如果你看懂了,那你perfect,如果你沒有看懂,也不要灰心,這裏介紹的只是一個大綱,讓你對遊戲編程有一個瞭解,最基礎層面的瞭解。

三。遊戲編程,你準備好了嗎?

這個部分講解如果你想開始遊戲編程應該具備那些基礎知識,這樣你才能接下來遊戲編程學習,當然下面的有些知識,我開始學習遊戲編程時,也不是都具備,但這些知識都是很容易學的知識,如果你基礎好,在遊戲編程中隨時學就可以,不耽誤你學習遊戲編程的進度。我在這段最後會指出那些是必須掌握的,因爲這些知識如果你在遊戲編程時學習再學,時間上真的不允許。


1。書,永遠是你的好朋友!
書,是你瞭解她最直接途徑,當然我說的書還包括所有遊戲編程資料。書,有好有壞,想要深刻了解她,你必須挑選精妙的好書,而且還有循序漸進的,合理次序的去讀它們。遊戲編程書籍大量風起雲涌的出現是在2000年以後,當然2000以前也有,只是很少一部分,從2000或者以前開始就研究3D遊戲的中國大哥們,現在可以說是現在中國遊戲行業的鼎樑支柱。現在出版有關遊戲方面的書籍大約有200左右本,中國人自己原著的書幾乎沒有,大多數都是翻譯國外的,就有幾本翻譯的質量很好(翻譯大哥大姐確實很辛苦,我承認這點,但拜託你們翻譯前要看懂再翻譯,否則望文生義,不如讓我們自己看英文原版)要麼自己寫的也是東挪西湊的,寫出來估計是想騙錢,誰叫中國人這麼老實,這麼好欺負了。其中大部分書籍是3D遊戲的,3D遊戲確實要比2D遊戲難一個數量級別,如果你足夠聰明,其實這些書看個幾十本,寫出一個在中國可以立足的3D引擎足夠了。但好象這樣聰明的人真的很少,有黃金的這個地方大家都知道,可是前往這塊寶地的道路太荊棘,很少有人走下來。
書,大家從出生時就接觸,學會讀書,這四個字,很少有人能領會,你看一本書,要麼否定,要麼肯定,如果你還是很迷糊,要麼是書寫的不好,要麼就是你知識水平層次有限,要麼就是你根本沒學會讀書。我在這裏只說一句話“要讀好書,思而不學則罔,學而不思則怠,溫故而知新”,我想高手很容易體會這句話。
想要學好遊戲編程,學會讀書是你要掌握的,也是你獲取知識最快的途徑,開始時,建議還是讀一些中文的遊戲編程書,因爲遊戲編程中充斥大量術語和名詞,沒有任何遊戲編程概念的人,直接看英文,即使你是老外,我估計你看一會就會爬在書上,眼皮一關,口水把它淹沒了。
看書後,代碼一定要仔細讀,而且對於初學者一定要親自去實現,這樣你才能加深理解,有時看書看不懂,一看代碼就全明白了。“紙上得來終覺淺,覺知此事必躬行”,我始終堅信這句話,只有你經歷了,你才能感受,就象你沒有失去過,就不會知道珍惜是什麼東西。
我相信既然你都看到這裏了,就應該知道我上面爲什麼給你打好的警鐘。看完書,就要寫代碼,最好不要一味的效仿,要有你自己的獨道之處,這樣才說明你認真考慮了這個問題,你也真正瞭解了,這個問題是什麼,應該怎麼解決,怎麼解決最有效果。
E文書,以後就要是你老婆(同性戀除外),天天都要見面,除非你離婚了,也就是遊戲編程這個愛情你不想要了,你提前離開了這個努力走到最後才能見到美好果實的幸福家庭。中文翻譯一般都很慢,中文翻譯出來,國外這個技術基本過時了,而且有能力翻譯的人本來就少,有時間幹這事的說他有病,也不足爲奇,因爲翻譯一本太浪費時間了。所以要適應去看E文,現在沒錢,就看電子的,很多國外新書,沒有電子的,但電子的夠我們初學的人玩很長時間,等有錢了,就直接去買國外正中的洋版,然後弄到家中,天天啃,工作時也啃,人家都會說你很有激情的。看電子的如果閒麻煩,就打印下來,打印下來還是花不了幾個鋼幣的,和買一本中文差不多(大家不要哭窮,一本好書100元我認爲很值得,裏面技術如果你掌握了,你想想,大把大把的票子就進你口袋裏,很多人買來不看,天天還抱怨書貴。)
這幾年來,我讀過很多遊戲編程方面的書,中文的基本都讀過了,現在我一直在讀E文書,有時到覺得看中文有些不適應,還有好多好書,我還沒有讀。讀E文書時,如果沒讀懂,自己一定要去網上查查相關資料,然後集中精力把它弄懂,現在很少有看不懂的E文遊戲編程書(知道我6級沒過的,別用磚仍我),有些還是看不懂,確實自己水平有限,但不是因爲英語問題,關於高深而複雜數學問題,即使翻譯成中文,我也很難看明白。
我在後面會把所有好的遊戲編程書籍都列出來,告訴大家那些可以買到,那些只有電子的。不好的書,我就不列出來了,只會浪費大家以後的時間。
2。遊戲編程所需要的基礎知識

我這裏介紹下要做一個好的,稱職的,遊戲程序員所需要。學習就和蓋樓一樣,要想上層建築牢固,你就要有堅實的基礎,我這裏介紹的基礎是你從事遊戲編程最基礎,基礎的不能再基礎的東西。
2。1 數學
數學是遊戲中支柱,沒有了它,任何都不要談,在你編寫你遊戲的時候,你就會知道,世界抽象成一堆數學是多麼的神奇,突然你會覺得以前枯燥無味的數學現在是一頓大餐,但這個是霸王餐。國外人寫關於引擎方面書的人,都可以說是數學高手,他們理論和實踐都很厲害,讓我崇拜的不得了。大學裏是你學好數學的最好機會,一定要弄明白它的現實意義,任何理論都不是憑空出來的,它一定有現實基礎,這個現實基礎,就可以幫助你很好理解這個理論。
2。1。1高等數學——微積分理論
在遊戲引擎中,很多遊戲特效都是通過微積分方程來解得的,高度仿真是現在遊戲的追求,真實感越強就需要越多的計算量。極限,一元微積分,多元微積分,級數,微分方程等等在遊戲圖形圖象和物理上都有明顯體現。有時一個碩士或者一個博士爲了擬真一個效果要花費幾個月或者幾年的時間,做爲一個遊戲程序員,微積分到達什麼層次我很難給出定義,但起碼如果別人給出了原理我們能看明白,並把它實現,我覺得就很可貴了。
2。1。2線性代數和空間解析幾何
在大學課本中,空間解析幾何是放在高等數學書裏面講的,但遊戲中,它和線性代數放到一起我認爲更加合適。線性代數所有知識都要掌握,在遊戲中它們比微積分體現的更淋漓盡致,理解上我個人認爲相對微積分更容易。
空間解析幾何主要講向量,平面,線,體,這些東西並通過線形代數矩陣進行空間變換,最後達到遊戲想要的目標。
2。1。3四元數
這個在大學裏面不學數學的,估計很少有人接觸,它也是來用來變換空間,理解起來不是那麼容易,但最常用的就是用四元數來表示旋轉。
我這裏只是一概而過,上面任何知識在遊戲中都有應用,但大學裏的數學不是爲了遊戲而開設的,所以和遊戲中用的數學在知識分列和講解上還是有很大差異,尤其是線性代數和空間解析幾何,不用擔心,我在後面介紹給大家一些好的遊戲書籍,對大家學習遊戲編程和有幫助的。
2。2語言
編寫遊戲c和c++是你首選,相對來講C++是你更應該掌握的。
2。2。1 其他語言爲什麼不是當今流行的編寫遊戲程序語言?
VB,JAVA,C#,等等其他語言,並不是說它們不能做遊戲,它們能做,由於語言本身設計機理的限制,只能做一些對遊戲速度要求低的遊戲,對於運行速度要求高的遊戲,它們被判成死刑。當然這個也取決於硬件的發展,以前8bit FC遊戲都用C語言和彙編來寫,現在由於硬件速度提高,用VB,JAVA,C#來寫這些遊戲運行也是可以的,例如現在興起的WebGame(網頁遊戲)。但如果你真想做遊戲的話,你一定想要了解現在最流行遊戲編寫,C和C++是你最好的選擇,也是你走上真正的遊戲編程道路的重要武器。
2。2。2 C和C++應該選擇那一個?
C和C++,這裏面我還要說一說,我個人更看好C++。大家都知道C是面向過程的,而C++是面向對象的,雖然C++的面向對象特性還不是很完善,但出於對大型軟件設計上的考慮,因爲遊戲引擎是大的工程,框架設計遠遠要比編程重要,一般框架設計用面向對象方式更直接,所以C++比C更有優越性性,而且如果你合理用好C++,並不見得C++比C速度慢。有時一個軟件架構和軟件運行上問題,很難取捨,對於大應用程序來說,都是一點點犧牲速度來獲得好的架構,是利大於弊的事情,這裏確實體現軟件工程的重要性質。
2。3。3 彙編,很重要嗎?
彙編語言也是你要掌握的,你說你語言學的好,但卻不會彙編,是一個天大的笑話。現在很少有彙編高手能寫出比編譯器優化出來的彙編代碼運行效率要高,因爲語言的不同,思考問題的方式就會有不同,就象最早紙帶機上的原語言一樣(可計算性與計算複雜性就講這東西)。如果遊戲都用匯編來寫,寫代碼效率很低,所以我們都用高級語言來寫,同時還要與底層有密切聯繫的,C和C++擔任大部分工作量。對於遊戲速度頻頸問題,有時我們用C和C++即使優化很多,代碼精簡很多,算法也改良很多,但由於語言本身設計上問題,和高效彙編來編寫還是有不同的,這時就要是彙編高手來做速度最快,內存和寄存器使用最少彙編程序。所以彙編還是很重要的。
2。3。4 其他CPU硬件指令
這裏只是說 INTER 和 AMD CPU 都支持的指令集,也是最常用指令集。
MMX和SSE SSE2是遊戲編程中最常用的指令集,這個指令集是 SIMD(single instruction multiple data),也就是單指令多數據流指令集,一個指令可以處理多個數據流運算。彙編CPU指令,一個指令只能執行一個數據流運算。
例如:
   彙編中
  ADD EAX,EBX
  這是一個加法指令,EAX,EBX是寄存器,是32位的。這個指令就是 EAX = EAX + EBX。這個過程只有一個數據流相加。
  而SIMD思想是,如果現在有2個指令
  ADD EAX,EBX  
  ADD ECX,EDX
  能不能讓他們一起執行?所以SIMD 指令提供這樣的功能,他用很大的寄存器,前一部分裝EAX值,後一部分裝ECX值,再用一個寄存器,前一部分裝EBX,後一部分裝EDX.
  SIMD 寄存器分成2部分[1部分][2部分]
  SIMD ADD 指令  積存器1  ,積存器2
  運算過程爲 寄存器1 [1部分] = 寄存器1  [1部分] + 寄存器2  [1部分] ;
      寄存器1 [2部分] = 寄存器1  [2部分] + 寄存器2  [2部分] ;
  這2個運行是在一個SIMD積寄存器用硬件來執行ADD 同時運行的。
  這裏只是說了SIMD思想,現在簡單介紹下 MMX,SSE,SSE2。
  
  MMX寄存器是32位的,所以它可以執行4個8bit數據同時運算,也可以執行2個16bit數據同時運算,具體要看使用哪個指令,在早期沒有SSE指令時,就用MMX,但MMX有缺點,它和FPU(浮點運算單元,專門執行浮點數運算)共用同樣寄存器,所以當你指令有中斷,從浮點運算跳到MMX運算,要告訴CPU,從MMX跳到FPU 也要告訴CPU,這樣數據要臨時保存,降低了處理速度。早期2D遊戲經常用這個。
  現在SSE,SSE2有自己單獨的寄存器可以使用,而且它們是128位的,支持4個32位整數或者浮點數同時運算。
  這些指令都沒有分支,所以使用時效率要我們掌握,因爲執行都是並行的,一個指令完成多個計算,所以即使你編寫SIMD代碼很差,速度也會提高几倍,遊戲中經常用SIMD處理顏色和數學運算問題。在遊戲速度瓶頸地方用這樣的代碼,公德無量。

2。3。5  ASM SHADER語言 和 高級SHADER 語言
開始學遊戲編程時,這個知識不一定要具備,因爲你不瞭解3D流水線內部細節學起來還是比較困難,所當你做完“軟引擎” 瞭解3D流水線,在學這個語言很容易,接下來的語言發揮,就靠你自己了。
早期的遊戲,所有的圖形圖象處理基本都由CPU來完成,然後把處理完的數據傳到顯存,用顯卡來顯示。現在的設計理念儘量解放CPU,把與圖形圖象有關的運算用顯卡來完成。但早期顯卡只支持固定流水線,所謂的固定流水線就是所有3D數據處理過程都是事先用硬件實現好的,這個過程是一個大過程,裏面封狀了很多小過程細節,用戶只需要輸入數據,顯卡負責輸出數據,至於用戶無法干預這個大過程,小過程更是接觸不到。再說的通俗一點,一個空間3D三角形要想顯示到計算機屏幕上,基本要經歷2個大過程,頂點處理和象素處理,頂點處理封狀了很多空間變換的小過程,象素處理包括象素混合小過程。這個過程是不可以訪問的,我們只能通過顯卡提供的接口來控制,而且改變方式很單一。(剛接觸這些可能不明白,現在你知道的不用太詳細,就知道大過程是不可以干預的就可以了,或者是隻有很少一部分可以干預)爲了讓圖形圖象處理更加完善話,讓人們可以參與到整個3D流水線中,實現更多豐富的效果,顯卡開始出現GPU單元(圖形處理單元),這時的3D流水線從固定流水編成了可編程流水線,有了早期的GPU 指令,大家都稱爲 SHADER指令,也就是ASM SHADER,和彙編一樣,這些指令都是和GPU指令一一對應的,隨着硬件更新,GPU越來越強大,支持指令越來越多,ASM SHADER 從1。0 到 1。4 ,到現在3。0版本。由於ASM SHADER 用起來不方便,就象我們用匯編寫程序一樣,所以又出現了高級SHADER語言,有DirectX3D下支持HLSL(high level shader language)和 OPGL下支持的GLSL(opengl shader language)這些語言都是面向過程。由於硬件設計限制,這些語言不能象C語言那樣隨意使用,SHADER語言有自己的使用規範,大家學習時一定要弄明白3D流水線內部實現過程,再使用SHADER簡直很容易。
還有一個要說的是,GPU現在還不支持分支預測,但GPU編程語言現在已經提供了豐富的條件判斷,條件判斷還是會影響到速度的。

重點你要掌握的是,數學,c和c++,彙編,數據結構,基本掌握的是計算機體系結構,離散數學,編譯原理,計算機網絡,操作系統,軟件工程,數據庫,人工智能。可以說這些是計算機最基礎的學科,你只有掌握了它們,無論你專研計算機哪個領域,你的基礎都是足夠的,遊戲編程中這些學科都可以用到,我們不用每個學科都精通的要命,我們要精通的是遊戲編程,也就是接觸到和遊戲相關的,我們有這些基礎完全可以看懂,然後我們在用自己時間來去專研這些學科在遊戲領域的應用。

四。遊戲編程,她的大門已經爲你打開。

1。 顏色之迷

計算機怎麼顯示圖形的,這個你必須要弄明白,計算機顯示彩色圖象是經歷了一個什麼樣的發展過程。
1。1 象素和屏幕顯示點
計算機顯示一個圖象是由象素組成,我們通常說的分辨率就是屏幕上顯示多少個象素。如果一個屏幕最大可以支持1024*768那麼它也可以支持800*600,當你屏幕分辨率是800*600時,一個象素佔據了屏幕多個屏幕顯示點,也就是說,只有當你分辨率調節到最大時,屏幕顯示點和象素點纔是一一對應的,至於一個象素佔據多個屏幕顯示點後顏色怎麼顯示這個是硬件的事,我也不是很瞭解。象素都是2進制存儲,然後由硬件根據顯存中當前象素值,根據顏色顯示模式的設定,來顯示指定顏色。
1。2 顏色組成和模式
計算機要顯示顏色,每個象素都有自己的顏色,通常顏色有3種模式,一個是調色板模式,一個是16bit模式,一個是32bit模式,我這裏說的通常,早期也有4bit模式,我要講出裏面的細節,讓看的人真正理解,不是死記硬背,你就會發現實質上只有2種模式,一個是調色版模式和bit顯示模式。
我先介紹位顯示模式,從4bit開始,早期顏色顯示很單調,硬件只支持16個顏色,當然這16個可以是黑白的,也可以是彩色的。總之硬件就支持16個顏色。所以用4bit表示4bit 2進制正好可以代表16個。
隨着硬件發展支持的顏色越來越多,發展到16bit,16bit開始有了嚴格限制,顏色是有三種色彩基元組成,也就是紅綠藍,人送江湖稱號RGB,16bit分成1555格式和565格式,1555就是1位給ALPHA(表示透明)分給RGB分別5bit,5bit可以表示色彩基元顏色是32種,RGB組合起來就是15bit,就是2的15次方,可以表示很多顏色了。而565格式沒有ALPHA位置,直接分給RGB位數爲565,也就是綠色多了一位,傳說中,專家說人眼對綠色明感,所以給綠色多分了一位。
而32bit分給 ALPHA 和 RGB 分別是 8888,每個都是8bit。
其實標準的顏色都是每個分量都是8bit,每個色彩基元都是256種,而16bit模式不能顯示出真實世界色彩。
調色板模式一般都是針對每個分量是8bit,也就是顏色組成是32位的。調色板模式有一個映射表數組,這個映射表數組每個元素都存放的是32位的顏色,而顯存存放的是一個索引,但硬件讀出顯存當前象素值時,然後用這個值當作索引去映射表數組裏面查對應的顏色,然後顯示到屏幕上。
相比較而言,調色板模式是最早期的,例如早期FC 8bit機 每個象素只佔8bit,只能表示256種顏色,而我們彩電可以表示很多顏色,爲了節省顯存,增加處理速度,還顯示出多種顏色,FC用調色板模式,而我們想換顏色時,其實只換調色板映射表數組某一個值就可以了,索引都不用變,畢竟索引是寫在顯存中的,一般改寫顯存還是速度很慢的。16bit模式也是在處理速度上,節省存儲空間上得以應用。畢竟這些顯示模式都是爲了應付以前硬件速度太慢而設計的,現在一般都用32bit模式。而且無論顏色基元的數字越大表示這個基元顏色越淺。
還有一個要說的就是ALPHA,這個分量是表示透明度的,這個分量如果是8bit,那麼它可以表示256種透明程度,255表示不透明,0表示完全透明。
現在大家知道你設置屏幕或者遊戲時1024*768*32 什麼意思了吧!每個象素佔32bit,屏幕顯示1024*768個象素。

1。3 顏色的運算
計算機支持顏色運算都是無符號顏色運算,顏色沒有負數,而且顏色運算有CLAMP和MOD
如果每個顏色佔8bit,顏色表示範圍爲0-255
這裏CLAMP指的是
if(x<0) x=0;
if(x>255) x=255;
這裏MOD指
if(x>255) x = x%255;
Color1(a1,r1,g1,b1) Color2(a2,r2,g2,b2)
顏色加減都是向量加減,每個分量做加減
1。3。1顏色加法
        Color3(a3,r3,g3,b3) = Color1(a1,r1,g1,b1) + Color2(a2,r2,g2,b2)   
a3 = a1 + a2;
r3 = r1 + r2;
        g3 = g1 + g2;
b3 = b1 + b2;
顏色加法一般都用CLAMP
1。3。2顏色乘法
Color3(a3,r3,g3,b3) = Color1(a1,r1,g1,b1) * Color2(a2,r2,g2,b2)   
a3 = a1 * a2;
r3 = r1 * r2;
        g3 = g1 * g2;
b3 = b1 * b2;
顏色乘法一般都用MOD
顏色加法和乘法在象素混合效果上經常用,有時爲了到達一個效果,加法和減法混合用,至於什麼時候用加法,什麼時候用乘法,沒有嚴格的規定,還是要看效果,一般對於全局光照模型顏色之間要用加法的,但其他光照模型可能不同,紋理混合或者紋理和顏色混合,加法和乘法都有各自用途。
  
2。Directx OpenGL到底用來幹什麼?

這裏只說他們支持圖形和圖象部分,其他部分不說。
很多人都聽過這2個名詞,其實他們是一個函數庫,這個函數庫爲我們做了一些最基本的和底層打交道的處理,其他它們還提供了一些常用的3D函數庫,算是一個2次開發,其實2次開發一般和底層沒有關係,所以在遊戲引擎中很多都自己來做,微軟做了很多2次開發,可以算是一個引擎。我前面說了,引擎沒有明確概念,只有適應程度之分,用它這個提供的來做遊戲,還是差很遠,做小遊戲當然沒問題。
我主要說說和底層打交道那部分,DX和OPGL最大功勞在於充分調度和發揮了顯卡性能,把顯卡的特性用接口的形式提供出來,他們各自都有自己的管理層次,管理方法,管理管線,至於怎麼管理,我也不是很清楚,但當你使用和顯卡資源相關的API時,你要仔細看這個函數各個參數說明,它會根據你的指定,來管理顯卡。但他的管理只是一部分,還有很大一部分要引擎裏面自己處理。
如果你不想自己寫驅動的話,那麼你還想控制顯卡,你就要用這些API,D3D(DX中主要處理3D的)和OPGL使用上還是有很大不同,所以學習他們也還要花費一些時間。我當初學習時,由於不瞭解3D渲染流程,學起來特別困難,很難看懂,我就放棄了他的學習,學習製作“軟引擎”(用CPU來實現顯卡提供的硬件功能),然後再學D3D,很容易的。有時後放棄是爲了選擇更好的,並不是真正的放棄。
至於學習D3D還是OPGL,我個人認爲無所謂的,但好象OPGL越更新越混亂,沒有DX那麼清晰,我也是聽別人說的,畢竟我不是很瞭解OPGL。

3。遊戲編程中的常用術語

遊戲編程充着大量常用術語,我不打算把它們都列出來,實在太多,我想對於初學者是來說,我希望,你在學習遊戲編程時,自己多查下資料究竟這些術語都有什麼含義,記住一定在學習遊戲編程時去查,也就是說,針對問題去查,而不是在沒有遇到任何問題時去查。其實我們的教育有個弊端,任何知識我們學了,不知道怎麼用。其實很多知識都是我們遇到問題時再去查資料,去找解決方式,而不是在不知道這個解決方式用來解決什麼的情況下嚇學。
最好大家把這些術語的中文和英文名稱看見都能知道是怎麼回事,因爲你到以後看英文書時,如果你知道這個術語的含義,看起來會很容易。


五 遊戲編程中的2D遊戲,你首先要做到的。

通往神殿的第一個考驗就是這個,不知道你是否能走下來,相信自己會成功,你的信念一定要不可動搖,當你走過這段路的時候,想想你現在所得到的,付出的其實不算什麼。
很多人可能會問,我想做3D遊戲,2D遊戲學它幹什麼。其實3D遊戲處理可以分成2個部分,一個是3D空間數據處理,經過紋理映射把象素寫到屏幕緩衝,接下來其他特效處理都是歸結到2D問題。
所以你想真正瞭解遊戲圖象處理過程,還是要學2D的。2D原理相對3D來說簡單很多,學起來也不是很難。我建議去看《WINDOWS遊戲編程大師技巧》裏面的代碼都讀明白,它用C語言實現一個小的遊戲引擎,我希望你用C++封狀成類的形式,重新按照自己規劃來實現,最後做出個遊戲。用引擎做出的遊戲和直接做遊戲還是有很大區別的,這樣你引擎也就符合引擎的概念,代碼重用性更強。這本書用的DirectX中DDraw接口來實現的,你一定要了解你使用的工具,它能用來幹什麼,它不能用來幹什麼,這樣你才能很好的遊戲編程。如果你不瞭解C語言,怎麼用C語言編程,都是一個道理的。我不想在過多詳細介紹DDraw爲我們提供了什麼特性,你自己去看書。
2D遊戲中,最常用的概念就是貼圖,把一個圖象貼到另一個上。2D遊戲中一種處理模式是在各個圖片上的處理,還有就是在象素上的處理,其實這些都可以歸結到象素上的處理,象素處理,就是處理顯存數據。
顏色模式,《WINDOWS遊戲編程大師技巧》這本書講的很詳細。
2D動畫系統,《WINDOWS遊戲編程大師技巧》這本書沒有詳細介紹,但你看它的代碼,代碼寫的很清楚而詳細,你就知道的。
GDI 我不知道大家聽說過沒有,它是WINDOW自帶的圖形圖象接口,我希望大家也能瞭解下,當時我是GDI和DDRAW一起學的,然後分別做了引擎,2個引擎接口也一樣,遊戲移植非常容易。

一個最重要的問題就是調試,8BIT模式下的遊戲,用編譯器帶的單步調式是不可能的,我機器死機N回。我現在也沒有發現好的辦法,最好的辦法就是自己做一個LOG日誌系統,把所有調式信息都寫到文件裏,用任務管理器把當前程序關掉,然後看文件寫的信息。
2D遊戲製作細節我沒有詳細介紹,畢竟我不是在講怎麼製作2D遊戲,我是講你應該注意什麼,怎麼學,我想《WINDOWS遊戲編程大師技巧》會給你想要的一切。當然我在學這本書前已經有了一些2D遊戲基礎,以前用VB做過遊戲,用GDI也做過,所以學起來還算容易,如果你以前沒有任何遊戲編程基礎就直接用DDraw,那麼我希望你多下點工夫,把它製作遊戲的流程都搞清楚,記住什麼時候用自己的雙手做出了自己2D遊戲,你纔算2D遊戲編程過關了。這本書仔細看吧!直到把它所有的精髓都掌握。
還有一個要說的就是,圖象處理常用算法,大家可以多看看圖象處理的書,遊戲中特效經常用到,其實如果你真想一心搞3D,2D上做一個坦克大戰這樣的遊戲就可以了,很多2D處理詳細東西,在學3D遊戲時,都可以接觸的。
六。遊戲編程中的3D遊戲,考驗你耐力和勇氣的時候到了!

前面你所遇到的一切都是小小測試,證明你有能力接受這個挑戰,在3D遊戲這個廣闊無垠的天地裏,它比2D遊戲更有讓你想象餘地的空間,因爲3D遊戲不僅僅包括2D遊戲所有,而且還包括很多其他東西。努力吧!朋友們,無論遇到什麼挫折,都不要放棄,因爲她最後會給你想要的。
我不知道其他人學習3D遊戲是一個什麼樣的過程,這裏我只介紹我自己的學習過程,因爲我是從挫敗中走過來的。
開始學3D,腦袋裏一片模糊,只有一點點大學裏學的計算機圖形學相關的知識,我不得不說學校裏講的計算機圖形學和遊戲還是大相徑庭的。
(這裏允許我抱怨一下,國外很多大學都開設了3D遊戲編程的課程,而且很專業,我看過老外的PPT。相對於國內,也有些,但不專業,我說遊戲學院騙錢你不要打我,它確實能讓你找到工作,但你做的永遠是下手,學不到底層的東西。我看過遊戲學院開設的課程,沒有一個是有技術含量的,用“外包”形容在貼切不過。道理也很簡單,中國現在牛人很少,我說搞引擎的高手全國有1000人都是保守的,真正能搞出名堂的,也不多於200人,這200人裏面學習遊戲編程經驗10年就很多了,中國3D遊戲起步很晚,相對國外,中國人愛跳槽的習慣,讓任何公司都沒有技術積累,發展更是困難,所以人才積累的少,而且這些人都很忙,在加上現在學校教育約束,即使他們想去高校教授遊戲課程也是不可能,何況人家都不願意去,這樣中國積累的人才更少)

所以你要系統學習遊戲中圖形學理論。
這裏我經歷了遊戲學習編程一次比較大的挫敗,當時自己是初學者,問過很多人學3D,應該從什麼入手。很多人都說從D3D開始入手,於是我做了。我不得不說的是,如果你不瞭解3D流水線過程,學D3D簡直是看天書,當時我以爲自己反覆的看書,寫程序,最後會理解的,浪費了我大量的時間,最後還是無法靈活掌握D3D,如果你無法掌握D3D,想做遊戲可能真的很困難。我終於認識到,我選擇的路是錯誤的,那些所謂的高手難道就學D3D學過來的?那麼他們花費的時間是可想而知的。因爲有些細節你無法掌握,你使用時就覺得匪夷所思。
《3D遊戲編程大師技巧》這本書是每個學3D的人都應該看的,這本書把顯卡硬件實現的功能都用軟件來做,真正讓你理解一個3D東西到最後的屏幕顯示,是一個什麼樣的過程。作者實現了一個軟引擎,軟引擎就是所有的3D功能都是用代碼自己寫的,沒有用什麼顯卡來做處理的引擎。這本書是一個經典鉅著,如果你想學3D,即使死也要把這本書弄明白,這樣不辜負作者寫這本書留下的汗水,寫一本書,尤其這麼PERFECT,太不容易了,國內人翻譯的也很出色,感謝他們。

《3D遊戲編程大師技巧》繼承了《WINDOWS遊戲編程大師技巧》裏面2D函數,然後3D功能以及流水線和引擎都是自己完成,這本書的代碼量要有十幾萬,我當時用C++重新封裝了《3D遊戲編程大師技巧》代碼,自己設計了一個面向對象固定流水線模式,代碼量13W左右,這個過程很艱辛,這本書我看了2遍,最後一共零零散散花費了大約9。10個月的時間。你會感覺你立刻升級了,HP,MP,CP都增長了,當然也包括RP,哈哈!(不知道這些術語的,大家多玩玩RPG遊戲吧!)
好東西去追求,不要怕浪費時間,浪費精力,你想想,你得到的最後會大於你的付出,這些都不算什麼。很多人問我怎麼學3D,我建議他們不能着急,要從學《3D遊戲編程大師技巧》開始,大約要8,9個月時間,把每個細節都弄明白,閉上眼睛,怎麼實現就很清楚,書上每一頁寫什麼都很明確。他們都覺得浪費時間,那麼這樣是永遠學不好的

1 3D數學是你要攻克的
雖然你數學學的好,但國內的教科書還是和遊戲中用的有些不同,畢竟沒有上過專門講解遊戲中數學知識的課程。這需要你係統學習遊戲編程中數學,3*3矩陣爲什麼有的人用,而有的人用4*4矩陣,爲什麼有的用矩陣轉置有的用矩陣的逆。《3D遊戲編程大師技巧》這本書介紹的很詳細,還有一本書就是《3D數學基礎:圖形與遊戲開發》很不錯(有中文的),先系統學習下,然後在學習遊戲編程時,不懂的時候,再回頭看看這些書,把所有的東西都徹底弄清。你如果數學基礎好,學這些都很容易,以後遊戲編程中最深奧的地方之一就是數學。

基本上我總結下,你要知道的是:
向量  4維 和 3維向量有什麼不同
矩陣  4*4 和 3*3 矩陣有什麼不同
四元數
ELUER角
以後有機會深入研究碰撞中的各種算法,還會遇到很多關於數學的問題,上面只是渲染有關係。
2 3D流水線的實現過程
我無法用言語來表明這個過程的重要性,整個3D流水線是是3D遊戲的脊柱,你的基礎知識牢固與否,主要看你這裏。3D流水線每一個細節我希望大家都要搞清楚,這個過程對初學者是要花費大量的時間專研與琢磨,D3D的固定流水線都是由硬件完成,如果你的硬件不支持,它會用軟件模擬,好,關鍵就在這裏,軟件模擬是怎麼回事,而《3D遊戲編程大師技巧》的流水線是自己用C語言寫的,也就是用軟件完成,這樣你能瞭解整個流水線的細節,同時你在學D3D時,對照着來學,你會發現,D3D學起來很容易。現在D3D和硬件都支持可編程流水線,而且DX10沒有固定流水線,所有變換過程都用SHADER語言控制顯卡完成,這個過程是3D流水線的縮影,所以3D流水線的重要性是是可想而知的。
我說了這麼多,3D流水線對你是一個新鮮的名詞,我也沒有去解釋它,我不想去解釋,完全留給你自己去,我始終堅持着,我只告訴你去的路,路上有什麼困難,應該怎麼走,你自己去體會這條路上的酸甜苦辣。我希望大家多花些時間在這上面,真真正正的自己寫代碼實現一下,基礎對你真的很重要,記住我說的話,很多人學習時,認爲自己理解了,沒有去實現,其實還是那句話“紙上得來終覺淺,絕知此事必躬行”,相信我,沒錯的。
        基本上我總結下,你要知道的是:
3D中的頂點結構,每個分量都用來幹什麼,三角形是基本渲染單元。
模型空間——》世界空間——》相機空間——》投影空間——》屏幕空間——》光柵化 這個過程和運行原理
材質究竟是什麼?
        常用的宏光照模型原理,光源類型
光源和材質和法向量關係
光照在哪個空間去執行(其實不是很嚴格)
紋理尋址,紋理映射方式,紋理混合,紋理過濾。
1D 2D 3D CUBE 紋理
Z 1/Z緩衝
2種相機模型
ALPHA 透明
關於光柵化三角形要特別注意,他最後混合紋理和光照顏色和ALPHA透明,還要判斷深度緩衝,最後是插值填寫每個象素。
3 D3D究竟要如何學習
《3D遊戲編程大師技巧》和D3D流水線過程還是有些差別的,比如在投影矩陣上,其實它們都是大同小異,只不過表現形式不同,原理都一樣。我希望大家自己可以找出來,深刻理解裏面原理。
還有一個重要的東西,就是哪些是D3D開發遊戲必須有的,哪些是D3D自己擴展的。必須有的,就是同硬件打交道的部分,而D3D中自己擴展了很多庫函數,例如數學庫,這個完全可以沒有,我們自己來實現,還有D3D中的EFFECT接口,它自己定義的。X文件所有函數接口。也就是說,你要理解,哪些是遊戲開發中必須有的,哪些是遊戲開發中自己完全可以不接觸底層來實現的。
遊戲編程中有3個緩衝區,顏色緩衝,深度緩衝,模板緩衝,前2個《3D遊戲編程大師技巧》中,都詳細的介紹,而模板對初學者可能很晦澀,大家先弄明白模板的機制,然後多看些例子,我想你會深刻理解它的含義的。
D3D的學習,可以看D3D SDK的例子,也可以找一些書籍,很多的。

基本上我總結下,你要知道的是:
D3D提供基本常用底層接口,那些是是D3D爲了編程必須提供的,那些是不用提供的,比如數學庫我們完全可以自己寫。
D3D頂點 索引BUFFER
顏色緩衝,模版緩衝,深度緩衝 以及對這些緩衝的操作
目標渲染對象、
D3D 中的3D流水線
單通道渲染,多通道渲染。
熟練操作上面的所有,這些都足夠了,其他的都是D3D中多餘的,如果你要自己做引擎,很多都要自己實現,當然初學者可以就用它擴展的函數庫,也很方便的。

4 其他要知道的遊戲知識
下面知識都屬於很強的遊戲技術範疇,他們只屬於單單遊戲中技術支持,引擎就是用合理的方式,把所有3D相關包括流水線和下面這些都整和到一起,但這種整和是有效的管理。
場景管理算法 :BSP OCTREE QUADTREE PORTAL PVS
動畫系統 :骨骼動畫,蒙皮骨骼動畫,漸變動畫,和這些動畫的混合
陰影  :陰影體 投影陰影 陰影影射
剔除算法 :包圍球 OBB AABB BHV算法
LOD系統         :視點無關LOD 視點相關LOD
廣告牌  :跟蹤相機方向 和 只圍繞y軸旋轉 粒子系統
這些是比較常用的,常常碰到的,根據基本的顏色運算,空間運算還能衍生出很多遊戲特效,等待你自己去看書,去解決。



七。3D引擎編程,令你的挑戰達到了極限
就象我前面說的,引擎沒有嚴格定義劃分,但對於當代的引擎,似乎大家都趨向于越好的東西,越健壯的支持,才稱上引擎。現在遊戲玩家對畫面擬真程度要求很高,這就要求引擎能更好的處理3D世界中大量數據,一個好的引擎,起碼要做到以下幾點(引用《3D.Game.Engine.Architecture.Engineering.RealTime.Applications.with.Wild.Magic》裏面的話)
1。如何把3D世界中大量數據,讓它實時快速處理。
2。引擎中的渲染器(用來管理數據,進行渲染處理的)接口應該怎麼定義。
3。如何讓使用引擎的人,能很容易的使用引擎。
4。當引擎中添加新特性時,如果讓引擎改動最小。
我感覺這4句話,概括的很精闢,如果讓我來概括,好象我現在還沒這個能力。這是一個當代引擎的新的定義,雖然不是全面,但它一語道破天機,如果你的引擎能達到上面4點,我想它已經足夠的優秀,同時說明你也很優秀了。下面我就分別解刨這4句話,讓大家對引擎有一個深刻的瞭解。我只是分析,這4句話要求高手纔可以完全去達到,我現在還不具備這個能力,所以只能幫大家分析。
1。如何把3D世界中大量數據,讓它實時快速處理。
  
3D世界中充滿了大量得數據,有效的處理只可以看見的,能感受到的就可以了。
3D引擎中,很多時候都在處理剪裁和剔除的問題,把不可見的或者和碰撞無關的數據用最快的方法弄掉,不讓它進入顯卡,一切還是停留在3D空間中。剪裁,剔除還有碰撞處理,永遠是3D引擎中最常見的話題,現在有很多成型的方法,大家自己通過學習就可以瞭解的。
2。引擎中的渲染器(用來管理數據,進行渲染處理的)接口應該怎麼定義。
即使你把3D數據給了顯卡,還是不能達到最快顯示,我們要把這些數據分類,重新組織,這裏面還涉及到存儲管理的問題。你的渲染器的接口要定義的和底層提供的DX或者OPGL相通,因爲最後你要調用的是這2個庫裏面的函數。
  
3。如何讓使用引擎的人,能很容易的使用引擎。
這是一個經驗問題,一個軟件設計給用戶使用,怎麼讓用戶很容易上手。但無論什麼樣的用戶,你必須對3D有了解纔可以使用,否則神仙也沒法完成這個引擎。
4。當引擎中添加新特性時,如果讓引擎改動最小。

經常說的一句話就是“計劃沒有變化快”,怎麼能讓引擎跟上時代的步伐,當硬件有革新,我們引擎就有革新,出現新的處理方法,引擎也要改進,用戶需求改變,引擎接口也要改變,我們要求引擎的所有改動最小,這樣纔是一個完美的引擎。
引擎是軟件設計+算法+編程的結合體,難點在軟件設計上,一個好的引擎,代碼幾百萬很正常,沒有一個好的設計來規範它們,混亂是不可避免的。

對於一個引擎,從設計到編程都很重要,一個人完成一個好的引擎是不可能的,多人協作來完成引擎,在大家相互配合的同時,每個人對自己的要完成的任務必須精通,還要有人協調這些工作。
好的引擎,要有一個抽象層次,然後是渲染API層次,還要支持多操作系統平臺,我在這裏沒有過多介紹各種技術細節,因爲很多細節在書中都可以找到,加上你的聰明,很多技術算法可以自己創造的。
對於遊戲中大量算法,引擎中到處都是,碰撞,場景管理,光照,紋理混合,動畫系統,粒子系統,內存管理,資源管理等等大家要多實踐,多思考,多看書,多看資料,把握每一個細節,把握每一個整體。看書時要帶着問題去看,同時也要帶出問題,因爲沒有一個方法是完美的,必定會有或多或少的缺陷。

現在開源的引擎確實不少,其實程序員都有一個共性,看別人代碼有時不如自己寫,確實這樣,有時只看代碼去體會別人的思想真的很難,但有時爲了去學習也要硬着頭皮去看的,跟蹤代碼。開始時,如果你不瞭解引擎究竟是什麼,這時最好集中看一個開源引擎,一定要把它的工作原理都弄明白,這樣你會得到很大的提升,你就會明白引擎是什麼,爲什麼不用D3D直接編寫遊戲,還有一點就是,有機會一定要去實現,這樣你的體會會更深。

八 淺談物理與人工智能

這2個都不是中國遊戲中的優勢,它們和圖形一樣,要求一定能力積累纔可以勝任。如果我沒有預測的話,未來中國遊戲中大量的需求將來自物理和人工智能,傳統的網絡RPG會慢慢不能滿足大家需要,而被時代所拋棄的。

這2方面的編程我只是略知一二,還算一個小白,在此簡單談談。
10。1 物理
遊戲中大部分物理模擬都集中在力學和運動學上,本來它們就是一個整體。因爲最後效果是大家看到的,而看到的都是物體在屏幕上的移動,所以所有的計算最終都歸結到物體移動上。
因爲遊戲畢竟是遊戲,人也畢竟是人,沒有必要模擬的那麼精確,同時人也是感覺不出來的。
所以要想做好物理上的編程,必須對力學和運動學有系統的瞭解,高中學的力學部分還不是很足夠,對於旋轉部分,也就是處理力矩和轉動慣量上,高中物理書都沒有講(我那時是沒有講,而且很多直線線形運動方程推倒其實是用微積分推倒的,高中書上都沒有明確推倒)
物理上的模擬也沒有逃脫物理計算基本規則,先是受力分析,然後計算合力,計算加速度,計算速度,最後計算位置,也可能涉及到動能和動量等知識,還有些流體力學等等吧。
物理其實處理的問題基本就是檢測物體碰撞,碰撞後的反映,物體運動情況。
至於理論,大家弄本大學物理,力學部分就足夠,如果數學好的話加上高中的物理知識,應該學起來不難的。
《遊戲開發物理學》這本書很好,可惜絕版了,但有電子版的,也有中文版。
10。2 AI
相對物理的編程書籍來說,AI的書很多。
AI是研究生必須學的課程,包括傳統的AI和計算智能。遊戲中常用的傳統AI包括自動機理論,A* 算法,回溯,圖搜索,剪枝等等吧。計算智能包括的是:遺傳算法,模糊計算,人工神經網絡。
我答UBI筆試的時候,裏面很多題都是A*算法,可見FPS遊戲中大量存在的都是AI的路徑搜索問題,讓電腦更加智能。
AI的遊戲編程書很多,我就看過幾本。《WINDOWS遊戲編程》中有一部分講的AI,《遊戲開發中人工智能》 《遊戲編程中的人工智能技術》這3本都有中文的,而且都有大量的實例,對於那些大量理論的書籍來說,看看它們還是很通俗的。還有很多好書,都是英文的。

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