此篇文章獻(xiàn)給那些為了游戲編程不怕困難的熱血青年,,它的神秘要我永遠(yuǎn)不間斷的去挑戰(zhàn)自我,超越自我,,這樣才能攀登到游戲技術(shù)的最高峰 ——阿哲VS自己 QQ79134054多希望大家一起交流與溝通 這篇文章是我一年半前,,找工作時(shí)候?qū)懙模菚r(shí)是發(fā)到學(xué)校的BBS上?,F(xiàn)在我工作了,,想法和以前也有不同,但對游戲引擎編程理念還是基本差不多,。在我沒遇到U3以前,,一直研究WILDMAGIC,可以說是GAMEBRYO的前身吧,,他們基本框架都差不多,,是完全面向?qū)ο螅a容易讀,,但它發(fā)展存在嚴(yán)重的弊端,,這個(gè)也是它為什么不是牛B引擎的原因。但從渲染和動(dòng)畫方面來看,,U3的 MATERIAL TREE 和 ANIM TREEE 是2個(gè)飛躍的,,當(dāng)我對我自己引擎渲染材質(zhì)和光照一籌莫展的時(shí)候,,MATERIAL TREE帶來的希望。對比 zfx (wildmagic)gamebryo 和ogre 還有U3,,各有優(yōu)缺點(diǎn),,而且你可以看到一個(gè)引擎發(fā)展,從一個(gè)以多邊形為渲染單元,,變成以mesh做為渲染單元(現(xiàn)在很少有引擎場景管理分割多邊形來做的 我始終喜歡zfx引擎,,它是00-02之間的引擎,完全讓你可以理解那時(shí)候顯卡不是很強(qiáng)的時(shí)候,,一個(gè)引擎應(yīng)該具備的特征,。對于架構(gòu)來講,(wildmagic)gamebryo 和ogre 做的很好,,u3的特點(diǎn)就是架構(gòu)亂,,沒有什么可讀性的技術(shù)文檔,研究起來十分吃力,。做為一個(gè)商業(yè)引擎,,對于渲染方面,我認(rèn)為(wildmagic)gamebryo 輸給了ogre,,框架設(shè)計(jì)還有弊端,,ogre確實(shí)是一個(gè)好引擎。而U3對于渲染過程,,光照,,陰影,就是一幀的渲染過程,,處理的十分得當(dāng),。動(dòng)態(tài)生成shader是一個(gè)引擎的發(fā)展的必然趨勢,而往往動(dòng)態(tài)生成最多的,,也就是材質(zhì)和光照,,它們不能分開,分開談無意義,,MATERIAL TREE 我始終認(rèn)為是個(gè)太好的想法了,,任何特效不需要程序員過多參與,美術(shù)可以搞定一切,,什么水,,反射,折射,,這些效果,,編寫起來易如反掌,還可以實(shí)時(shí)光看效果。其他動(dòng)態(tài)生成,,也就是根據(jù)配置不同,,來做處理,動(dòng)態(tài)編譯shader弊端太大,,不能做到所有,,而且不靈活,如果動(dòng)態(tài)生成和動(dòng)態(tài)編譯合起來,,簡直牛B透頂了。現(xiàn)在我的引擎已經(jīng)有了MATERIAL TREE這個(gè)功能,,ANIM TREEE在制作中,。這里面我重點(diǎn)談的是圖形方面,略帶些動(dòng)畫方面,,一個(gè)引擎最基本的是內(nèi)核,,包含內(nèi)存管理,文件讀寫,,資源管理等等吧,,也十分重要,我的引擎這些寫的都很簡單,基本都是wildmagic里面的,。 我總結(jié)3D引擎編程的4個(gè)階段 第一階段是了解3D原理和數(shù)學(xué)基礎(chǔ),,大學(xué)里面學(xué)的線性代數(shù),,概率統(tǒng)計(jì)和高等數(shù)學(xué)完全足夠,在3D中都有充分體現(xiàn)。最好自己能做一個(gè)軟引擎,,這樣整個(gè)3D流水線自己完全可以掌控,然后在學(xué)DX之類的API很容易,。 第二階段不要看引擎,,還是應(yīng)該以實(shí)現(xiàn)各種效果和基本算法為基礎(chǔ),包括各種圖形特效,,場景管理,,剪裁算法,各種動(dòng)畫算法,,等等,,所有那些單一的算法,如果這些都不是了解很好,,那么做引擎時(shí)引擎框架的接口也不會設(shè)計(jì)好,!再添加這些算法和效果時(shí) 會很困難,效率也不會很高,。 第三階段,,就是看大量的引擎,對引擎有很深刻的概念,3D引擎只是引擎的一部分,,引擎主要是框架,,如果框架搭建好了,那么引擎的效率是很顯著的,,其他底層細(xì)節(jié)優(yōu)化,,也會有明顯的優(yōu)勢體現(xiàn)。 第四階段,,再好的引擎沒有成功的游戲支撐都是白費(fèi),,你不僅僅是做引擎,而是做的有開發(fā)價(jià)值的引擎,,可以很好的為游戲服務(wù)的引擎,。 下面這段話寫于一年半前~~ 前言 本人不才,姑且以自己經(jīng)驗(yàn)來談如何學(xué)游戲編程,,這個(gè)話題我醞釀了很久,,它確實(shí)很難寫,因?yàn)槲乙膊皇琴Y深高手,,才剛剛登堂入室,,游戲編程大師功力一般都十幾年左右,所以讓我這樣的小卒寫的深入淺出更何談容易,,錯(cuò)誤出現(xiàn)并不奇怪,,高手見笑也在所難免,請大家指正,,我會欣然笑納,。但這幾年走過的路,讓我知道這么學(xué)是正確的,,大體過程經(jīng)驗(yàn)告訴我,,這樣做是對的,高手的指引告訴我,,這樣做是對的,。 這篇文章主要討論如何學(xué)習(xí)游戲圖形編程和游戲引擎編程,告訴沒有接觸游戲過編程或者現(xiàn)在關(guān)于怎么學(xué)好游戲編程還迷惑的PEOPLE所要走的方向,,完全拋開技術(shù)和代碼實(shí)現(xiàn)進(jìn)行談?wù)?。至于游戲邏輯這幾年重點(diǎn)沒有發(fā)到這個(gè)上面上,很難總結(jié),。 經(jīng)驗(yàn)的限制,,對于如何編寫一個(gè)好的引擎(至于“好”這個(gè)詞都是相對而言,能做的滿意就是我所期望的),,至今為止我還沒有這個(gè)能力,,但我相信經(jīng)過我的努力,不久的將來,我會實(shí)現(xiàn)這個(gè)愿望,,因?yàn)槲业囊粋€(gè)愿望就是實(shí)現(xiàn)一個(gè)好的引擎,。 我從下面幾個(gè)方面來說明如果學(xué)習(xí),記住只是如何學(xué)習(xí),,要想學(xué)好就要靠你自己,。 1。 你真的喜歡游戲編程嗎,? 2。 要了解游戲編程 3,。 學(xué)會讀書,,自學(xué)與思考,,交流與合作 4,。 游戲編程需要的基礎(chǔ)知識 5。 2D游戲編程 6,。 3D游戲編程 7。 游戲引擎編程 8,。淺談?dòng)螒蛭锢砗虯I 一。游戲編程,你真的愛她嗎,? 當(dāng)你聽完我的介紹后,,你就要決定游戲編程是否適合你,。 游戲編程可簡單可復(fù)雜,簡單的2D 《蛇吃豆》,,復(fù)雜的現(xiàn)在流行的3D游戲,。咱們不說簡單的,,因?yàn)槟悴幌雽W(xué)習(xí)游戲編程就為了做一個(gè)簡單的游戲,。確實(shí)每個(gè)人對他所向往的東西都想徹底了解清楚,,可是我給你的第一個(gè)警告,,復(fù)雜的3D游戲,復(fù)雜到難以想象,。 1 你思想需要改變嗎,? 打開話題,,游戲是一個(gè)結(jié)合體,,她是一個(gè)音樂,,美術(shù),技術(shù),,創(chuàng)意相結(jié)合的藝術(shù)品,,你要用藝術(shù)的眼光去欣賞的,因?yàn)楹玫挠螒蚴怯盟囆g(shù)的眼光來設(shè)計(jì),,除了某國的網(wǎng)游不算外,很多經(jīng)典的游戲流芳百世,,成為真正游戲玩家佳話。 中國的游戲?yàn)槭裁催@么落后,你要聯(lián)想下,,當(dāng)年中國為什么會被八國聯(lián)軍所侵略,。腐朽的思想是根本原因,,從而導(dǎo)致了腐朽的社會制度,。游戲行業(yè)也是這樣,看待游戲的中國人,始終帶著眼鏡,,用腐朽思想看待游戲,,所以現(xiàn)在出現(xiàn)腐朽的游戲行業(yè),,導(dǎo)致中國游戲發(fā)展緩慢,有人曾經(jīng)說中國游戲不久就趕超日本和美國,我認(rèn)為是扯淡,而且不是一般的扯淡,,具體原因后面我會詳細(xì)說明,。 從小的時(shí)候,,國外的電子游戲產(chǎn)品就跑進(jìn)了我的空間,,廢寢忘食的玩?zhèn)€沒玩,,因?yàn)榈⒄`學(xué)習(xí),,從此電子游戲被老師和家長全部封殺,任何事物都有利有弊,,魯迅的《拿來主義》曾說過“去其糟粕,,取其精華”。在中國,,電子游戲被視為過街老鼠,。確實(shí)要承認(rèn)電子游戲有負(fù)面影響,但這些負(fù)面影響是誰產(chǎn)生的,,本質(zhì)上是我們自己,最后本來是精華的東西從我們身邊擦肩而過,,從小霸王以后的國外游戲機(jī)沒有任何仿造,,導(dǎo)致了游戲機(jī)技術(shù)從此斷代,,現(xiàn)在卻又想起來趕超。 而現(xiàn)在,,國人知道努力了,,國家看到有錢可賺開始支持了,腐朽的游戲思想?yún)s還在蔓延,,網(wǎng)絡(luò)游戲就是這樣環(huán)境下成長的新生兒,,國內(nèi)網(wǎng)絡(luò)游戲每年要大批量生產(chǎn),但存活的基本沒幾個(gè),。不能否定,,沒有利益的事情沒人干,但你還不能否定,,有些事情即使沒有利益,,但還是有人干,哪怕知道自己并不能得到什么,。國內(nèi)的人,,很少是第2種人,他們把游戲做為賺錢工具,,垃圾游戲隔三差五的紛紛涌出,。相比來講,我只拿日本舉例子,,雖然小日本和咱們有愁,,但我們不得不承認(rèn)小日本在游戲這方面思想層次完完全全超越我們,他們有嚴(yán)格游戲教育背景,,他們做一款游戲,,要按照嚴(yán)格的流程,從設(shè)計(jì)到編程,,以至最后的測試,,都有著干一行敬一行的精神,否則《生化危機(jī)》這樣游戲你是永遠(yuǎn)看不到的,。 所以你要改變自己的思想,,游戲是一種藝術(shù)品,你要有一種藝術(shù)境界來去欣賞她,。 2 你有毅力愛她愛到底嗎,? 也許我上面的話,你還能接受,,殘酷的在下面,,以我的經(jīng)驗(yàn)告訴我,如果你編程和游戲理論起步是零,你要對游戲編程達(dá)到略有小成的水平最少要4到5年,,我比較蠢,,花了6年。這6年來,,幾乎每天平均學(xué)習(xí)4-5個(gè)小時(shí)左右,,當(dāng)然假期都要算上。頭3年半基本學(xué)習(xí)計(jì)算機(jī)基礎(chǔ)知識,,包括數(shù)學(xué),,數(shù)據(jù)結(jié)構(gòu),計(jì)算機(jī)體系結(jié)構(gòu),,人工智能,,匯編,編譯原理,,操作系統(tǒng),,網(wǎng)絡(luò),軟件工程,,離散數(shù)學(xué),,算法分析。我們大學(xué)4年基本就學(xué)這東西,,這些都是基礎(chǔ),,游戲編程都需要,還有一個(gè)就高等物理我沒有學(xué),,導(dǎo)致我現(xiàn)在對于一些物理微積分方程很難理解,,當(dāng)然這里并不一定是問題,只要你肯努力,,沒有學(xué)不會的,。完全把這些學(xué)好,花4年時(shí)間真的不容易,。我曾經(jīng)抱怨自己沒保研而痛苦的經(jīng)歷考研,,現(xiàn)在我卻認(rèn)為是值得的,我很難有時(shí)間在集中精力的復(fù)習(xí)這些專業(yè)課了,,尤其是數(shù)學(xué),。 在游戲編程中,上面的基本知識都可以用到,,所以我說游戲編程很復(fù)雜一點(diǎn)不假,。就拿游戲中最難的部分——一個(gè)好的游戲引擎來說(這里說的好引擎),世界上能把她做出來的人很少,,中國更是寥寥無幾,。 上面只是理論基礎(chǔ),,要走進(jìn)游戲編程最基本的。過硬的編程技能更是需要的,,其實(shí)這些理論學(xué)習(xí)可以和編程相結(jié)合,,在編程中學(xué)習(xí)理論,,為了學(xué)習(xí)理論而增長編程經(jīng)驗(yàn),。 有了基礎(chǔ),你才能進(jìn)一步學(xué)習(xí)游戲編程,,2D游戲和3D游戲理論都要學(xué),,這又要花費(fèi)很長時(shí)間,這個(gè)是我下面要詳細(xì)說的,。 看完我寫的,,你可能心驚膽寒,所以你要愛她,,深深的愛她,,否則你承受痛苦的時(shí)候享受不到暗含的樂趣。 3 愛她請從游戲開始,。 很多人可能不解,,游戲編程為什么要從游戲開始,玩游戲時(shí),,有很多潛移默化的東西影響著我們編寫游戲程序,,很多靈感確實(shí)從游戲中得來。一般的游戲編程高手,,都是從小由于游戲?qū)λ麄兙薮笪?,從而走上游戲道路,雖然不是絕對,,但按統(tǒng)計(jì)學(xué)角度講可以說是一個(gè)事實(shí),。一個(gè)不愛玩游戲的人,愛上游戲編程的幾率是很小的,。其實(shí)很多人小的時(shí)候都愛玩游戲,,他們都是從游戲廳張大,只有一少部分,,走向了游戲開發(fā)這個(gè)行業(yè),,他們之間有著明顯不同,走向游戲開發(fā)的人,,是真的被游戲背后那種神秘東西所吸引,,并想要揭開它,而另一些人,,則是完全迎合了游戲開發(fā)的需要——玩的高興,。 我想說的是,一個(gè)游戲編程高手,必定是一個(gè)游戲玩家,,他們都是從玩游戲而愛上游戲,,從而走上游戲編程道路。這條路充滿了荊棘,,不是一般人能走到最后的,。所以你一定要愛她! 當(dāng)然任何事情都不絕對的,,你可能就是那不愛游戲但愛游戲編程(或者和游戲性無關(guān)的那部分編程)小概率的人,。 二。游戲編程,,你真的了解她嗎,? 游戲編程,這個(gè)概念包含了很多深層次的東西,。 1.廣義上,,我給的定義是,游戲引擎開發(fā)和游戲邏輯開發(fā),。 游戲邏輯開發(fā)是集中力量只開發(fā)游戲中劇情部分,,你只需要做的是什么時(shí)候顯示什么,什么時(shí)候放出什么聲音,,什么時(shí)候通過網(wǎng)絡(luò)傳輸什么數(shù)據(jù),,什么時(shí)候這個(gè)物體或者人物做什么動(dòng)作。至于底層怎么顯示,,聲音如何處理,,網(wǎng)絡(luò)如何傳輸,物體動(dòng)作怎么實(shí)現(xiàn)的,,你不用關(guān)心,,關(guān)心這些的是游戲引擎。所以說游戲引擎負(fù)責(zé)技術(shù)方面,,而游戲邏輯負(fù)責(zé)游戲文化內(nèi)涵,。 成功的游戲是以好的游戲邏輯為基礎(chǔ)的,而游戲引擎并不是成功游戲主要條件,,但好的游戲配上好的游戲引擎,,確實(shí)會給人一種震撼,相比同樣的游戲邏輯,,好的游戲引擎顯示效果會給人一種全新視覺和聽覺感受,。 至于游戲邏輯我不想過多解釋,但并不是說游戲邏輯簡單,,游戲邏輯也可以復(fù)雜的要命,,這取決與游戲復(fù)雜程度和游戲引擎與這個(gè)游戲的關(guān)聯(lián)程度,。為了解釋這句話,我不得不從游戲引擎解釋開始,。 早期的游戲是沒有游戲引擎這個(gè)概念,,都是一個(gè)游戲一套代碼,隨著游戲越來越多,,大家發(fā)現(xiàn)開發(fā)有些游戲中,,有很多可重用的代碼,逐漸把這些重用代碼封狀起來,,這就是早期的引擎,。對于引擎沒有明確的概念,,只有好壞和適應(yīng)程度之分,,所謂的好壞,就是引擎支持功能和顯示特性等是否strong,而適應(yīng)程度是指一個(gè)引擎是否適合開發(fā)這個(gè)游戲,,開發(fā)這個(gè)游戲是否要自己再編寫一些額外的代碼,。 我舉個(gè)例子 如果我用開發(fā)混斗羅的引擎(假如它有引擎)來開發(fā)RPG,和開發(fā)RPG游戲的“RPG游戲開發(fā)大師”相比,,我們還要做很多工作,,才能完成玩法功能一樣的游戲。 所以說很難有明確的界限劃分這一堆代碼是否是游戲引擎,,但游戲引擎的任務(wù)是不用質(zhì)疑的,,它的任務(wù)就是盡量不用負(fù)責(zé)底層處理,而專心到游戲邏輯上來,。 2.從狹義上分,,我只分解游戲引擎部分,基本包括(1)游戲圖形引擎(2)聲音引擎(3)網(wǎng)絡(luò)引擎(4)腳本引擎(5)GUI(6)人工智能引擎(7)物理引擎,。 (6)(7)兩個(gè)不是必須的,,而前5個(gè)是一個(gè)好的游戲引擎要基本具備的,其實(shí)每個(gè)游戲引擎中都具備物理引擎,,只不過很多游戲?qū)τ谖锢硪蟛皇呛芨?,所以就集成到了圖形引擎中或者游戲邏輯中。 圖形引擎是引擎中最難的,,它基本要處理游戲引擎中70-80%的工作量,,它的主要任務(wù)是負(fù)責(zé)圖形高效顯示,包括速度和精度,。后面我會集中并詳細(xì)解釋,。至于聲音和網(wǎng)絡(luò)引擎大家通過字面就可以知道它干什么。本人對聲音處理和網(wǎng)絡(luò)傳輸知道甚少,,說出來只能誤人子弟,。 至于腳本我還略有研究,,我想解釋下什么是腳本,游戲中為什么用腳本,。腳本有時(shí)很難給出一個(gè)定義,,但大家都知道那些是腳本語言,我給出的解釋是用軟件 CPU(虛擬CPU)來運(yùn)行的編程語言就是腳本語言,,軟件CPU和所說硬件CPU是對立的,,也就是說腳本運(yùn)行與否先是關(guān)聯(lián)到這個(gè)虛擬CPU,在虛擬CPU上運(yùn)行,,然后再又映射到真正CPU,,來真正運(yùn)行。這個(gè)過程很抽象,,我覺2個(gè)例子,,第一個(gè)就是JAVA語言,它有一個(gè)虛擬機(jī),,這個(gè)虛擬機(jī)就是軟件CPU,。再舉一個(gè)例子,我現(xiàn)在要編寫這樣一個(gè)指令,、 PRINT S 這個(gè)指令表示打印S S代表一個(gè)萬能類型,。 為了實(shí)現(xiàn)這個(gè)指令,你首先要有一個(gè)函數(shù)來負(fù)責(zé)處理打印 比如是這樣的函數(shù) void print(S) { cout<<S; } 這里只是偽代碼,,只是表示這個(gè)意思,。 你首先要找出PRINT這個(gè)單詞,讀入到一個(gè)buffer1,,然后把參數(shù)讀入buffer2 if(buffer1 == PRINT) print(buffer2); 這里段代碼其實(shí)就是一個(gè)軟件CPU,,它負(fù)責(zé)虛擬運(yùn)行PRINT S 這個(gè)指令。 那么游戲中為什么要用腳本呢,!最簡單解釋就是靈活性好,。拿一個(gè)RPG游戲例子來說,游戲中有大量物品,,每個(gè)物品有大量的屬性,,如果我把這些屬性值直接寫到游戲中,每一個(gè)小小的改變就要編譯整個(gè)游戲,,花費(fèi)很多時(shí)間,,靈活性很差。 如果我把這些寫到一個(gè)文件中,,用腳本語言來編輯,,只需要編譯腳本文件就可以了,當(dāng)然如果你腳本是解釋型的語言,,不用編譯直接可以運(yùn)行,。 當(dāng)然腳本還有很多好處,,主要目的還是方便性和靈活性。 其實(shí)GUI(圖形用戶接口)是一個(gè)重要部分,。3D游戲中,,出現(xiàn)的是大量的3D模型,這些模型是先用文件的形式存放好的,,而文件里面包括的是3D數(shù)據(jù)和這些數(shù)據(jù)的組織方式,。 至于數(shù)據(jù)怎么組織是你引擎要規(guī)定好的,這樣也方便讀取,,最后把3D數(shù)據(jù)加載到內(nèi)存?,F(xiàn)在問題是3D數(shù)據(jù)上,我們怎么能有效的得到這些3D模型的數(shù)據(jù),,手工寫進(jìn)文本里,?我靠,那是奴隸社會,,SB的做法,。我想你不會這么做。人類很聰明,,這就是為什么人把其他動(dòng)物關(guān)進(jìn)籠子里,而不是其他動(dòng)物把人關(guān)進(jìn)籠子里的原因,。既然我們很聰明,,就要想一個(gè)辦法快速的定義3D數(shù)據(jù),然后保存成文件,。這樣一個(gè)3D編輯器就產(chǎn)生了,。3D編輯器就是類似于3DMAX那種,但引擎中的編輯器是有特殊目的的,,使用者要按照引擎指定要求編輯3D數(shù)據(jù),,這樣引擎高效的顯示和處理數(shù)據(jù)比較容易,至于3D數(shù)據(jù)是怎么組織的,,是一個(gè)設(shè)計(jì)上的問題,,由你引擎來決定,設(shè)計(jì)好壞,,決定你引擎加載數(shù)據(jù)是否容易,,關(guān)系到最后渲染。所以一般好的游戲引擎都有自己GUI,,但你也可以用3DMAX這樣的軟件,,然后讀3DMAX文件變成自己可以利用的數(shù)據(jù)形式。 說到這里,,不知道上面的概念大家是否理解,,我想如果你沒接觸過引擎,,可能真的不理解。其實(shí)我很難用簡短的語言把這么復(fù)雜的問題說清楚,,如果有一天你把3D學(xué)的融會貫通,,你發(fā)現(xiàn)我說的是對的。我不知道大家是否發(fā)現(xiàn)一個(gè)共性的問題,,有時(shí)你讀一本書,,無論你怎么認(rèn)真把它看完一遍,你都很難掌握里面的知識,,當(dāng)你再認(rèn)真看第二遍的時(shí)候,,你突然覺得這本書沒有第一次看那么晦澀難懂。有些知識都是前后呼應(yīng)的,,它們之間相互聯(lián)系,,要想完整的理解它們?nèi)币徊豢伞S螒蚓幊痰闹R也是這樣,。我前面介紹的如果你看懂了,,那你perfect,如果你沒有看懂,,也不要灰心,,這里介紹的只是一個(gè)大綱,讓你對游戲編程有一個(gè)了解,,最基礎(chǔ)層面的了解,。 三。游戲編程,,你準(zhǔn)備好了嗎,? 這個(gè)部分講解如果你想開始游戲編程應(yīng)該具備那些基礎(chǔ)知識,這樣你才能接下來游戲編程學(xué)習(xí),,當(dāng)然下面的有些知識,,我開始學(xué)習(xí)游戲編程時(shí),也不是都具備,,但這些知識都是很容易學(xué)的知識,,如果你基礎(chǔ)好,在游戲編程中隨時(shí)學(xué)就可以,,不耽誤你學(xué)習(xí)游戲編程的進(jìn)度,。我在這段最后會指出那些是必須掌握的,因?yàn)檫@些知識如果你在游戲編程時(shí)學(xué)習(xí)再學(xué),,時(shí)間上真的不允許,。 1。書,,永遠(yuǎn)是你的好朋友,! 書,,是你了解她最直接途徑,當(dāng)然我說的書還包括所有游戲編程資料,。書,,有好有壞,想要深刻了解她,,你必須挑選精妙的好書,,而且還有循序漸進(jìn)的,合理次序的去讀它們,。游戲編程書籍大量風(fēng)起云涌的出現(xiàn)是在2000年以后,,當(dāng)然2000以前也有,只是很少一部分,,從2000或者以前開始就研究3D游戲的中國大哥們,,現(xiàn)在可以說是現(xiàn)在中國游戲行業(yè)的鼎梁支柱。現(xiàn)在出版有關(guān)游戲方面的書籍大約有200左右本,,中國人自己原著的書幾乎沒有,,大多數(shù)都是翻譯國外的,就有幾本翻譯的質(zhì)量很好(翻譯大哥大姐確實(shí)很辛苦,,我承認(rèn)這點(diǎn),,但拜托你們翻譯前要看懂再翻譯,否則望文生義,,不如讓我們自己看英文原版)要么自己寫的也是東挪西湊的,,寫出來估計(jì)是想騙錢,誰叫中國人這么老實(shí),,這么好欺負(fù)了。其中大部分書籍是3D游戲的,,3D游戲確實(shí)要比2D游戲難一個(gè)數(shù)量級別,,如果你足夠聰明,其實(shí)這些書看個(gè)幾十本,,寫出一個(gè)在中國可以立足的3D引擎足夠了,。但好象這樣聰明的人真的很少,有黃金的這個(gè)地方大家都知道,,可是前往這塊寶地的道路太荊棘,,很少有人走下來。 書,,大家從出生時(shí)就接觸,,學(xué)會讀書,這四個(gè)字,,很少有人能領(lǐng)會,,你看一本書,,要么否定,要么肯定,,如果你還是很迷糊,,要么是書寫的不好,要么就是你知識水平層次有限,,要么就是你根本沒學(xué)會讀書,。我在這里只說一句話“要讀好書,思而不學(xué)則罔,,學(xué)而不思則怠,,溫故而知新”,我想高手很容易體會這句話,。 想要學(xué)好游戲編程,,學(xué)會讀書是你要掌握的,也是你獲取知識最快的途徑,,開始時(shí),,建議還是讀一些中文的游戲編程書,因?yàn)橛螒蚓幊讨谐涑獯罅啃g(shù)語和名詞,,沒有任何游戲編程概念的人,,直接看英文,即使你是老外,,我估計(jì)你看一會就會爬在書上,,眼皮一關(guān),口水把它淹沒了,。 看書后,,代碼一定要仔細(xì)讀,而且對于初學(xué)者一定要親自去實(shí)現(xiàn),,這樣你才能加深理解,,有時(shí)看書看不懂,一看代碼就全明白了,?!凹埳系脕斫K覺淺,覺知此事必躬行”,,我始終堅(jiān)信這句話,,只有你經(jīng)歷了,你才能感受,,就象你沒有失去過,,就不會知道珍惜是什么東西。 我相信既然你都看到這里了,就應(yīng)該知道我上面為什么給你打好的警鐘,??赐陼鸵獙懘a,,最好不要一味的效仿,,要有你自己的獨(dú)道之處,這樣才說明你認(rèn)真考慮了這個(gè)問題,,你也真正了解了,,這個(gè)問題是什么,應(yīng)該怎么解決,,怎么解決最有效果,。 E文書,以后就要是你老婆(同性戀除外),,天天都要見面,,除非你離婚了,也就是游戲編程這個(gè)愛情你不想要了,,你提前離開了這個(gè)努力走到最后才能見到美好果實(shí)的幸福家庭,。中文翻譯一般都很慢,中文翻譯出來,,國外這個(gè)技術(shù)基本過時(shí)了,,而且有能力翻譯的人本來就少,有時(shí)間干這事的說他有病,,也不足為奇,,因?yàn)榉g一本太浪費(fèi)時(shí)間了。所以要適應(yīng)去看E文,,現(xiàn)在沒錢,,就看電子的,很多國外新書,,沒有電子的,,但電子的夠我們初學(xué)的人玩很長時(shí)間,等有錢了,,就直接去買國外正中的洋版,然后弄到家中,,天天啃,,工作時(shí)也啃,人家都會說你很有激情的,??措娮拥娜绻e麻煩,就打印下來,打印下來還是花不了幾個(gè)鋼幣的,,和買一本中文差不多(大家不要哭窮,,一本好書100元我認(rèn)為很值得,里面技術(shù)如果你掌握了,,你想想,,大把大把的票子就進(jìn)你口袋里,很多人買來不看,,天天還抱怨書貴,。) 這幾年來,我讀過很多游戲編程方面的書,,中文的基本都讀過了,,現(xiàn)在我一直在讀E文書,有時(shí)到覺得看中文有些不適應(yīng),,還有好多好書,,我還沒有讀。讀E文書時(shí),,如果沒讀懂,,自己一定要去網(wǎng)上查查相關(guān)資料,然后集中精力把它弄懂,,現(xiàn)在很少有看不懂的E文游戲編程書(知道我6級沒過的,,別用磚仍我),有些還是看不懂,,確實(shí)自己水平有限,,但不是因?yàn)橛⒄Z問題,關(guān)于高深而復(fù)雜數(shù)學(xué)問題,,即使翻譯成中文,,我也很難看明白。 我在后面會把所有好的游戲編程書籍都列出來,,告訴大家那些可以買到,,那些只有電子的。不好的書,,我就不列出來了,,只會浪費(fèi)大家以后的時(shí)間。 2,。游戲編程所需要的基礎(chǔ)知識 我這里介紹下要做一個(gè)好的,,稱職的,游戲程序員所需要,。學(xué)習(xí)就和蓋樓一樣,,要想上層建筑牢固,,你就要有堅(jiān)實(shí)的基礎(chǔ),我這里介紹的基礎(chǔ)是你從事游戲編程最基礎(chǔ),,基礎(chǔ)的不能再基礎(chǔ)的東西,。 2。1 數(shù)學(xué) 數(shù)學(xué)是游戲中支柱,,沒有了它,,任何都不要談,在你編寫你游戲的時(shí)候,,你就會知道,,世界抽象成一堆數(shù)學(xué)是多么的神奇,突然你會覺得以前枯燥無味的數(shù)學(xué)現(xiàn)在是一頓大餐,,但這個(gè)是霸王餐,。國外人寫關(guān)于引擎方面書的人,都可以說是數(shù)學(xué)高手,,他們理論和實(shí)踐都很厲害,,讓我崇拜的不得了。大學(xué)里是你學(xué)好數(shù)學(xué)的最好機(jī)會,,一定要弄明白它的現(xiàn)實(shí)意義,,任何理論都不是憑空出來的,它一定有現(xiàn)實(shí)基礎(chǔ),,這個(gè)現(xiàn)實(shí)基礎(chǔ),,就可以幫助你很好理解這個(gè)理論。 2,。1,。1高等數(shù)學(xué)——微積分理論 在游戲引擎中,很多游戲特效都是通過微積分方程來解得的,,高度仿真是現(xiàn)在游戲的追求,,真實(shí)感越強(qiáng)就需要越多的計(jì)算量。極限,,一元微積分,,多元微積分,級數(shù),,微分方程等等在游戲圖形圖象和物理上都有明顯體現(xiàn),。有時(shí)一個(gè)碩士或者一個(gè)博士為了擬真一個(gè)效果要花費(fèi)幾個(gè)月或者幾年的時(shí)間,做為一個(gè)游戲程序員,,微積分到達(dá)什么層次我很難給出定義,,但起碼如果別人給出了原理我們能看明白,并把它實(shí)現(xiàn),,我覺得就很可貴了。 2。1,。2線性代數(shù)和空間解析幾何 在大學(xué)課本中,,空間解析幾何是放在高等數(shù)學(xué)書里面講的,但游戲中,,它和線性代數(shù)放到一起我認(rèn)為更加合適,。線性代數(shù)所有知識都要掌握,在游戲中它們比微積分體現(xiàn)的更淋漓盡致,,理解上我個(gè)人認(rèn)為相對微積分更容易,。 空間解析幾何主要講向量,平面,,線,,體,這些東西并通過線形代數(shù)矩陣進(jìn)行空間變換,,最后達(dá)到游戲想要的目標(biāo),。 2。1,。3四元數(shù) 這個(gè)在大學(xué)里面不學(xué)數(shù)學(xué)的,,估計(jì)很少有人接觸,它也是來用來變換空間,,理解起來不是那么容易,,但最常用的就是用四元數(shù)來表示旋轉(zhuǎn)。 我這里只是一概而過,,上面任何知識在游戲中都有應(yīng)用,,但大學(xué)里的數(shù)學(xué)不是為了游戲而開設(shè)的,所以和游戲中用的數(shù)學(xué)在知識分列和講解上還是有很大差異,,尤其是線性代數(shù)和空間解析幾何,,不用擔(dān)心,我在后面介紹給大家一些好的游戲書籍,,對大家學(xué)習(xí)游戲編程和有幫助的,。 2。2語言 編寫游戲c和c++是你首選,,相對來講C++是你更應(yīng)該掌握的,。 2。2,。1 其他語言為什么不是當(dāng)今流行的編寫游戲程序語言,? VB,JAVA,,C#,,等等其他語言,,并不是說它們不能做游戲,它們能做,,由于語言本身設(shè)計(jì)機(jī)理的限制,,只能做一些對游戲速度要求低的游戲,對于運(yùn)行速度要求高的游戲,,它們被判成死刑,。當(dāng)然這個(gè)也取決于硬件的發(fā)展,以前8bit FC游戲都用C語言和匯編來寫,,現(xiàn)在由于硬件速度提高,,用VB,JAVA,,C#來寫這些游戲運(yùn)行也是可以的,,例如現(xiàn)在興起的WebGame(網(wǎng)頁游戲)。但如果你真想做游戲的話,,你一定想要了解現(xiàn)在最流行游戲編寫,,C和C++是你最好的選擇,也是你走上真正的游戲編程道路的重要武器,。 2,。2。2 C和C++應(yīng)該選擇那一個(gè),? C和C++,,這里面我還要說一說,我個(gè)人更看好C++,。大家都知道C是面向過程的,,而C++是面向?qū)ο蟮模m然C++的面向?qū)ο筇匦赃€不是很完善,,但出于對大型軟件設(shè)計(jì)上的考慮,,因?yàn)橛螒蛞媸谴蟮墓こ蹋蚣茉O(shè)計(jì)遠(yuǎn)遠(yuǎn)要比編程重要,,一般框架設(shè)計(jì)用面向?qū)ο蠓绞礁苯?,所以C++比C更有優(yōu)越性性,而且如果你合理用好C++,,并不見得C++比C速度慢,。有時(shí)一個(gè)軟件架構(gòu)和軟件運(yùn)行上問題,很難取舍,,對于大應(yīng)用程序來說,,都是一點(diǎn)點(diǎn)犧牲速度來獲得好的架構(gòu),是利大于弊的事情,,這里確實(shí)體現(xiàn)軟件工程的重要性質(zhì),。 2,。3。3 匯編,,很重要嗎,? 匯編語言也是你要掌握的,你說你語言學(xué)的好,,但卻不會匯編,是一個(gè)天大的笑話?,F(xiàn)在很少有匯編高手能寫出比編譯器優(yōu)化出來的匯編代碼運(yùn)行效率要高,,因?yàn)檎Z言的不同,思考問題的方式就會有不同,,就象最早紙帶機(jī)上的原語言一樣(可計(jì)算性與計(jì)算復(fù)雜性就講這東西),。如果游戲都用匯編來寫,寫代碼效率很低,,所以我們都用高級語言來寫,,同時(shí)還要與底層有密切聯(lián)系的,C和C++擔(dān)任大部分工作量,。對于游戲速度頻頸問題,,有時(shí)我們用C和C++即使優(yōu)化很多,代碼精簡很多,,算法也改良很多,,但由于語言本身設(shè)計(jì)上問題,和高效匯編來編寫還是有不同的,,這時(shí)就要是匯編高手來做速度最快,,內(nèi)存和寄存器使用最少匯編程序。所以匯編還是很重要的,。 2,。3。4 其他CPU硬件指令 這里只是說 INTER 和 AMD CPU 都支持的指令集,,也是最常用指令集,。 MMX和SSE SSE2是游戲編程中最常用的指令集,這個(gè)指令集是 SIMD(single instruction multiple data),,也就是單指令多數(shù)據(jù)流指令集,,一個(gè)指令可以處理多個(gè)數(shù)據(jù)流運(yùn)算。匯編CPU指令,,一個(gè)指令只能執(zhí)行一個(gè)數(shù)據(jù)流運(yùn)算,。 例如: 匯編中 ADD EAX,EBX 這是一個(gè)加法指令,,EAX,,EBX是寄存器,,是32位的。這個(gè)指令就是 EAX = EAX + EBX,。這個(gè)過程只有一個(gè)數(shù)據(jù)流相加,。 而SIMD思想是,如果現(xiàn)在有2個(gè)指令 ADD EAX,,EBX ADD ECX,,EDX 能不能讓他們一起執(zhí)行?所以SIMD 指令提供這樣的功能,,他用很大的寄存器,,前一部分裝EAX值,后一部分裝ECX值,,再用一個(gè)寄存器,,前一部分裝EBX,后一部分裝EDX. SIMD 寄存器分成2部分[1部分][2部分] SIMD ADD 指令 積存器1 ,,積存器2 運(yùn)算過程為 寄存器1 [1部分] = 寄存器1 [1部分] + 寄存器2 [1部分] ,; 寄存器1 [2部分] = 寄存器1 [2部分] + 寄存器2 [2部分] ; 這2個(gè)運(yùn)行是在一個(gè)SIMD積寄存器用硬件來執(zhí)行ADD 同時(shí)運(yùn)行的,。 這里只是說了SIMD思想,,現(xiàn)在簡單介紹下 MMX,SSE,,SSE2,。 MMX寄存器是32位的,所以它可以執(zhí)行4個(gè)8bit數(shù)據(jù)同時(shí)運(yùn)算,,也可以執(zhí)行2個(gè)16bit數(shù)據(jù)同時(shí)運(yùn)算,,具體要看使用哪個(gè)指令,在早期沒有SSE指令時(shí),,就用MMX,,但MMX有缺點(diǎn),它和FPU(浮點(diǎn)運(yùn)算單元,,專門執(zhí)行浮點(diǎn)數(shù)運(yùn)算)共用同樣寄存器,,所以當(dāng)你指令有中斷,從浮點(diǎn)運(yùn)算跳到MMX運(yùn)算,,要告訴CPU,,從MMX跳到FPU 也要告訴CPU,這樣數(shù)據(jù)要臨時(shí)保存,,降低了處理速度,。早期2D游戲經(jīng)常用這個(gè)。 現(xiàn)在SSE,SSE2有自己單獨(dú)的寄存器可以使用,,而且它們是128位的,,支持4個(gè)32位整數(shù)或者浮點(diǎn)數(shù)同時(shí)運(yùn)算。 這些指令都沒有分支,,所以使用時(shí)效率要我們掌握,,因?yàn)閳?zhí)行都是并行的,一個(gè)指令完成多個(gè)計(jì)算,,所以即使你編寫SIMD代碼很差,,速度也會提高幾倍,游戲中經(jīng)常用SIMD處理顏色和數(shù)學(xué)運(yùn)算問題,。在游戲速度瓶頸地方用這樣的代碼,,公德無量。 2,。3。5 ASM SHADER語言 和 高級SHADER 語言 開始學(xué)游戲編程時(shí),,這個(gè)知識不一定要具備,,因?yàn)槟悴涣私?D流水線內(nèi)部細(xì)節(jié)學(xué)起來還是比較困難,所當(dāng)你做完“軟引擎” 了解3D流水線,,在學(xué)這個(gè)語言很容易,,接下來的語言發(fā)揮,就靠你自己了,。 早期的游戲,,所有的圖形圖象處理基本都由CPU來完成,然后把處理完的數(shù)據(jù)傳到顯存,,用顯卡來顯示?,F(xiàn)在的設(shè)計(jì)理念盡量解放CPU,把與圖形圖象有關(guān)的運(yùn)算用顯卡來完成,。但早期顯卡只支持固定流水線,,所謂的固定流水線就是所有3D數(shù)據(jù)處理過程都是事先用硬件實(shí)現(xiàn)好的,這個(gè)過程是一個(gè)大過程,,里面封狀了很多小過程細(xì)節(jié),,用戶只需要輸入數(shù)據(jù),顯卡負(fù)責(zé)輸出數(shù)據(jù),,至于用戶無法干預(yù)這個(gè)大過程,,小過程更是接觸不到。再說的通俗一點(diǎn),,一個(gè)空間3D三角形要想顯示到計(jì)算機(jī)屏幕上,,基本要經(jīng)歷2個(gè)大過程,頂點(diǎn)處理和象素處理,,頂點(diǎn)處理封狀了很多空間變換的小過程,,象素處理包括象素混合小過程,。這個(gè)過程是不可以訪問的,我們只能通過顯卡提供的接口來控制,,而且改變方式很單一,。(剛接觸這些可能不明白,現(xiàn)在你知道的不用太詳細(xì),,就知道大過程是不可以干預(yù)的就可以了,,或者是只有很少一部分可以干預(yù))為了讓圖形圖象處理更加完善話,讓人們可以參與到整個(gè)3D流水線中,,實(shí)現(xiàn)更多豐富的效果,,顯卡開始出現(xiàn)GPU單元(圖形處理單元),這時(shí)的3D流水線從固定流水編成了可編程流水線,,有了早期的GPU 指令,,大家都稱為 SHADER指令,也就是ASM SHADER,,和匯編一樣,,這些指令都是和GPU指令一一對應(yīng)的,隨著硬件更新,,GPU越來越強(qiáng)大,,支持指令越來越多,ASM SHADER 從1,。0 到 1,。4 ,到現(xiàn)在3,。0版本,。由于ASM SHADER 用起來不方便,就象我們用匯編寫程序一樣,,所以又出現(xiàn)了高級SHADER語言,,有DirectX3D下支持HLSL(high level shader language)和 OPGL下支持的GLSL(opengl shader language)這些語言都是面向過程。由于硬件設(shè)計(jì)限制,,這些語言不能象C語言那樣隨意使用,,SHADER語言有自己的使用規(guī)范,大家學(xué)習(xí)時(shí)一定要弄明白3D流水線內(nèi)部實(shí)現(xiàn)過程,,再使用SHADER簡直很容易,。 還有一個(gè)要說的是,GPU現(xiàn)在還不支持分支預(yù)測,,但GPU編程語言現(xiàn)在已經(jīng)提供了豐富的條件判斷,,條件判斷還是會影響到速度的。 重點(diǎn)你要掌握的是,數(shù)學(xué),,c和c++,,匯編,數(shù)據(jù)結(jié)構(gòu),,基本掌握的是計(jì)算機(jī)體系結(jié)構(gòu),,離散數(shù)學(xué),編譯原理,,計(jì)算機(jī)網(wǎng)絡(luò),,操作系統(tǒng),軟件工程,,數(shù)據(jù)庫,,人工智能??梢哉f這些是計(jì)算機(jī)最基礎(chǔ)的學(xué)科,,你只有掌握了它們,無論你專研計(jì)算機(jī)哪個(gè)領(lǐng)域,,你的基礎(chǔ)都是足夠的,,游戲編程中這些學(xué)科都可以用到,我們不用每個(gè)學(xué)科都精通的要命,,我們要精通的是游戲編程,也就是接觸到和游戲相關(guān)的,,我們有這些基礎(chǔ)完全可以看懂,,然后我們在用自己時(shí)間來去專研這些學(xué)科在游戲領(lǐng)域的應(yīng)用。 四,。游戲編程,,她的大門已經(jīng)為你打開。 1,。 顏色之迷 計(jì)算機(jī)怎么顯示圖形的,,這個(gè)你必須要弄明白,計(jì)算機(jī)顯示彩色圖象是經(jīng)歷了一個(gè)什么樣的發(fā)展過程,。 1,。1 象素和屏幕顯示點(diǎn) 計(jì)算機(jī)顯示一個(gè)圖象是由象素組成,我們通常說的分辨率就是屏幕上顯示多少個(gè)象素,。如果一個(gè)屏幕最大可以支持1024*768那么它也可以支持800*600,,當(dāng)你屏幕分辨率是800*600時(shí),一個(gè)象素占據(jù)了屏幕多個(gè)屏幕顯示點(diǎn),,也就是說,,只有當(dāng)你分辨率調(diào)節(jié)到最大時(shí),屏幕顯示點(diǎn)和象素點(diǎn)才是一一對應(yīng)的,至于一個(gè)象素占據(jù)多個(gè)屏幕顯示點(diǎn)后顏色怎么顯示這個(gè)是硬件的事,,我也不是很了解,。象素都是2進(jìn)制存儲,然后由硬件根據(jù)顯存中當(dāng)前象素值,,根據(jù)顏色顯示模式的設(shè)定,,來顯示指定顏色。 1,。2 顏色組成和模式 計(jì)算機(jī)要顯示顏色,,每個(gè)象素都有自己的顏色,通常顏色有3種模式,,一個(gè)是調(diào)色板模式,,一個(gè)是16bit模式,一個(gè)是32bit模式,我這里說的通常,,早期也有4bit模式,我要講出里面的細(xì)節(jié),,讓看的人真正理解,不是死記硬背,,你就會發(fā)現(xiàn)實(shí)質(zhì)上只有2種模式,,一個(gè)是調(diào)色版模式和bit顯示模式。 我先介紹位顯示模式,,從4bit開始,,早期顏色顯示很單調(diào),硬件只支持16個(gè)顏色,,當(dāng)然這16個(gè)可以是黑白的,,也可以是彩色的??傊布椭С?6個(gè)顏色,。所以用4bit表示4bit 2進(jìn)制正好可以代表16個(gè)。 隨著硬件發(fā)展支持的顏色越來越多,,發(fā)展到16bit,,16bit開始有了嚴(yán)格限制,顏色是有三種色彩基元組成,,也就是紅綠藍(lán),,人送江湖稱號RGB,16bit分成1555格式和565格式,,1555就是1位給ALPHA(表示透明)分給RGB分別5bit,,5bit可以表示色彩基元顏色是32種,RGB組合起來就是15bit,,就是2的15次方,,可以表示很多顏色了,。而565格式?jīng)]有ALPHA位置,直接分給RGB位數(shù)為565,,也就是綠色多了一位,,傳說中,專家說人眼對綠色明感,,所以給綠色多分了一位,。 而32bit分給 ALPHA 和 RGB 分別是 8888,每個(gè)都是8bit,。 其實(shí)標(biāo)準(zhǔn)的顏色都是每個(gè)分量都是8bit,,每個(gè)色彩基元都是256種,而16bit模式不能顯示出真實(shí)世界色彩,。 調(diào)色板模式一般都是針對每個(gè)分量是8bit,,也就是顏色組成是32位的。調(diào)色板模式有一個(gè)映射表數(shù)組,,這個(gè)映射表數(shù)組每個(gè)元素都存放的是32位的顏色,,而顯存存放的是一個(gè)索引,但硬件讀出顯存當(dāng)前象素值時(shí),,然后用這個(gè)值當(dāng)作索引去映射表數(shù)組里面查對應(yīng)的顏色,,然后顯示到屏幕上。 相比較而言,,調(diào)色板模式是最早期的,,例如早期FC 8bit機(jī) 每個(gè)象素只占8bit,只能表示256種顏色,,而我們彩電可以表示很多顏色,,為了節(jié)省顯存,增加處理速度,,還顯示出多種顏色,F(xiàn)C用調(diào)色板模式,,而我們想換顏色時(shí),,其實(shí)只換調(diào)色板映射表數(shù)組某一個(gè)值就可以了,索引都不用變,,畢竟索引是寫在顯存中的,,一般改寫顯存還是速度很慢的。16bit模式也是在處理速度上,,節(jié)省存儲空間上得以應(yīng)用,。畢竟這些顯示模式都是為了應(yīng)付以前硬件速度太慢而設(shè)計(jì)的,現(xiàn)在一般都用32bit模式,。而且無論顏色基元的數(shù)字越大表示這個(gè)基元顏色越淺,。 還有一個(gè)要說的就是ALPHA,,這個(gè)分量是表示透明度的,這個(gè)分量如果是8bit,,那么它可以表示256種透明程度,,255表示不透明,0表示完全透明,。 現(xiàn)在大家知道你設(shè)置屏幕或者游戲時(shí)1024*768*32 什么意思了吧,!每個(gè)象素占32bit,屏幕顯示1024*768個(gè)象素,。 1,。3 顏色的運(yùn)算 計(jì)算機(jī)支持顏色運(yùn)算都是無符號顏色運(yùn)算,顏色沒有負(fù)數(shù),,而且顏色運(yùn)算有CLAMP和MOD 如果每個(gè)顏色占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) 顏色加減都是向量加減,每個(gè)分量做加減 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 顏色加法和乘法在象素混合效果上經(jīng)常用,,有時(shí)為了到達(dá)一個(gè)效果,加法和減法混合用,,至于什么時(shí)候用加法,,什么時(shí)候用乘法,沒有嚴(yán)格的規(guī)定,,還是要看效果,,一般對于全局光照模型顏色之間要用加法的,但其他光照模型可能不同,,紋理混合或者紋理和顏色混合,,加法和乘法都有各自用途。 2,。Directx OpenGL到底用來干什么,? 這里只說他們支持圖形和圖象部分,其他部分不說,。 很多人都聽過這2個(gè)名詞,,其實(shí)他們是一個(gè)函數(shù)庫,這個(gè)函數(shù)庫為我們做了一些最基本的和底層打交道的處理,,其他它們還提供了一些常用的3D函數(shù)庫,,算是一個(gè)2次開發(fā),其實(shí)2次開發(fā)一般和底層沒有關(guān)系,,所以在游戲引擎中很多都自己來做,,微軟做了很多2次開發(fā),,可以算是一個(gè)引擎。我前面說了,,引擎沒有明確概念,,只有適應(yīng)程度之分,用它這個(gè)提供的來做游戲,,還是差很遠(yuǎn),,做小游戲當(dāng)然沒問題。 我主要說說和底層打交道那部分,,DX和OPGL最大功勞在于充分調(diào)度和發(fā)揮了顯卡性能,,把顯卡的特性用接口的形式提供出來,他們各自都有自己的管理層次,,管理方法,,管理管線,至于怎么管理,,我也不是很清楚,,但當(dāng)你使用和顯卡資源相關(guān)的API時(shí),你要仔細(xì)看這個(gè)函數(shù)各個(gè)參數(shù)說明,,它會根據(jù)你的指定,,來管理顯卡。但他的管理只是一部分,,還有很大一部分要引擎里面自己處理,。 如果你不想自己寫驅(qū)動(dòng)的話,那么你還想控制顯卡,,你就要用這些API,,D3D(DX中主要處理3D的)和OPGL使用上還是有很大不同,所以學(xué)習(xí)他們也還要花費(fèi)一些時(shí)間,。我當(dāng)初學(xué)習(xí)時(shí),,由于不了解3D渲染流程,學(xué)起來特別困難,,很難看懂,,我就放棄了他的學(xué)習(xí),學(xué)習(xí)制作“軟引擎”(用CPU來實(shí)現(xiàn)顯卡提供的硬件功能),,然后再學(xué)D3D,很容易的,。有時(shí)后放棄是為了選擇更好的,,并不是真正的放棄。 至于學(xué)習(xí)D3D還是OPGL,,我個(gè)人認(rèn)為無所謂的,,但好象OPGL越更新越混亂,,沒有DX那么清晰,我也是聽別人說的,,畢竟我不是很了解OPGL,。 3。游戲編程中的常用術(shù)語 游戲編程充著大量常用術(shù)語,,我不打算把它們都列出來,,實(shí)在太多,我想對于初學(xué)者是來說,,我希望,,你在學(xué)習(xí)游戲編程時(shí),自己多查下資料究竟這些術(shù)語都有什么含義,,記住一定在學(xué)習(xí)游戲編程時(shí)去查,,也就是說,針對問題去查,,而不是在沒有遇到任何問題時(shí)去查,。其實(shí)我們的教育有個(gè)弊端,任何知識我們學(xué)了,,不知道怎么用,。其實(shí)很多知識都是我們遇到問題時(shí)再去查資料,去找解決方式,,而不是在不知道這個(gè)解決方式用來解決什么的情況下嚇學(xué),。 最好大家把這些術(shù)語的中文和英文名稱看見都能知道是怎么回事,因?yàn)槟愕揭院罂从⑽臅鴷r(shí),,如果你知道這個(gè)術(shù)語的含義,,看起來會很容易。 五 游戲編程中的2D游戲,,你首先要做到的,。 通往神殿的第一個(gè)考驗(yàn)就是這個(gè),不知道你是否能走下來,,相信自己會成功,,你的信念一定要不可動(dòng)搖,當(dāng)你走過這段路的時(shí)候,,想想你現(xiàn)在所得到的,,付出的其實(shí)不算什么。 很多人可能會問,,我想做3D游戲,,2D游戲?qū)W它干什么。其實(shí)3D游戲處理可以分成2個(gè)部分,,一個(gè)是3D空間數(shù)據(jù)處理,,經(jīng)過紋理映射把象素寫到屏幕緩沖,,接下來其他特效處理都是歸結(jié)到2D問題。 所以你想真正了解游戲圖象處理過程,,還是要學(xué)2D的,。2D原理相對3D來說簡單很多,學(xué)起來也不是很難,。我建議去看《WINDOWS游戲編程大師技巧》里面的代碼都讀明白,,它用C語言實(shí)現(xiàn)一個(gè)小的游戲引擎,我希望你用C++封狀成類的形式,,重新按照自己規(guī)劃來實(shí)現(xiàn),,最后做出個(gè)游戲。用引擎做出的游戲和直接做游戲還是有很大區(qū)別的,,這樣你引擎也就符合引擎的概念,,代碼重用性更強(qiáng)。這本書用的DirectX中DDraw接口來實(shí)現(xiàn)的,,你一定要了解你使用的工具,,它能用來干什么,它不能用來干什么,,這樣你才能很好的游戲編程,。如果你不了解C語言,怎么用C語言編程,,都是一個(gè)道理的,。我不想在過多詳細(xì)介紹DDraw為我們提供了什么特性,你自己去看書,。 2D游戲中,,最常用的概念就是貼圖,把一個(gè)圖象貼到另一個(gè)上,。2D游戲中一種處理模式是在各個(gè)圖片上的處理,,還有就是在象素上的處理,其實(shí)這些都可以歸結(jié)到象素上的處理,,象素處理,,就是處理顯存數(shù)據(jù)。 顏色模式,,《WINDOWS游戲編程大師技巧》這本書講的很詳細(xì),。 2D動(dòng)畫系統(tǒng),《WINDOWS游戲編程大師技巧》這本書沒有詳細(xì)介紹,,但你看它的代碼,,代碼寫的很清楚而詳細(xì),你就知道的。 GDI 我不知道大家聽說過沒有,,它是WINDOW自帶的圖形圖象接口,我希望大家也能了解下,,當(dāng)時(shí)我是GDI和DDRAW一起學(xué)的,,然后分別做了引擎,2個(gè)引擎接口也一樣,,游戲移植非常容易,。 一個(gè)最重要的問題就是調(diào)試,8BIT模式下的游戲,,用編譯器帶的單步調(diào)式是不可能的,,我機(jī)器死機(jī)N回。我現(xiàn)在也沒有發(fā)現(xiàn)好的辦法,,最好的辦法就是自己做一個(gè)LOG日志系統(tǒng),,把所有調(diào)式信息都寫到文件里,用任務(wù)管理器把當(dāng)前程序關(guān)掉,,然后看文件寫的信息,。 2D游戲制作細(xì)節(jié)我沒有詳細(xì)介紹,畢竟我不是在講怎么制作2D游戲,,我是講你應(yīng)該注意什么,,怎么學(xué),我想《WINDOWS游戲編程大師技巧》會給你想要的一切,。當(dāng)然我在學(xué)這本書前已經(jīng)有了一些2D游戲基礎(chǔ),,以前用VB做過游戲,用GDI也做過,,所以學(xué)起來還算容易,,如果你以前沒有任何游戲編程基礎(chǔ)就直接用DDraw,那么我希望你多下點(diǎn)工夫,,把它制作游戲的流程都搞清楚,,記住什么時(shí)候用自己的雙手做出了自己2D游戲,你才算2D游戲編程過關(guān)了,。這本書仔細(xì)看吧,!直到把它所有的精髓都掌握。 還有一個(gè)要說的就是,,圖象處理常用算法,,大家可以多看看圖象處理的書,游戲中特效經(jīng)常用到,,其實(shí)如果你真想一心搞3D,,2D上做一個(gè)坦克大戰(zhàn)這樣的游戲就可以了,很多2D處理詳細(xì)東西,在學(xué)3D游戲時(shí),,都可以接觸的,。 六。游戲編程中的3D游戲,,考驗(yàn)?zāi)隳土陀職獾臅r(shí)候到了,! 前面你所遇到的一切都是小小測試,證明你有能力接受這個(gè)挑戰(zhàn),,在3D游戲這個(gè)廣闊無垠的天地里,,它比2D游戲更有讓你想象余地的空間,因?yàn)?D游戲不僅僅包括2D游戲所有,,而且還包括很多其他東西,。努力吧!朋友們,,無論遇到什么挫折,,都不要放棄,因?yàn)樗詈髸o你想要的,。 我不知道其他人學(xué)習(xí)3D游戲是一個(gè)什么樣的過程,,這里我只介紹我自己的學(xué)習(xí)過程,因?yàn)槲沂菑拇鞌≈凶哌^來的,。 開始學(xué)3D,,腦袋里一片模糊,只有一點(diǎn)點(diǎn)大學(xué)里學(xué)的計(jì)算機(jī)圖形學(xué)相關(guān)的知識,,我不得不說學(xué)校里講的計(jì)算機(jī)圖形學(xué)和游戲還是大相徑庭的,。 (這里允許我抱怨一下,國外很多大學(xué)都開設(shè)了3D游戲編程的課程,,而且很專業(yè),,我看過老外的PPT。相對于國內(nèi),,也有些,,但不專業(yè),我說游戲?qū)W院騙錢你不要打我,,它確實(shí)能讓你找到工作,,但你做的永遠(yuǎn)是下手,學(xué)不到底層的東西,。我看過游戲?qū)W院開設(shè)的課程,,沒有一個(gè)是有技術(shù)含量的,用“外包”形容在貼切不過,。道理也很簡單,,中國現(xiàn)在牛人很少,我說搞引擎的高手全國有1000人都是保守的,真正能搞出名堂的,,也不多于200人,,這200人里面學(xué)習(xí)游戲編程經(jīng)驗(yàn)10年就很多了,中國3D游戲起步很晚,,相對國外,,中國人愛跳槽的習(xí)慣,讓任何公司都沒有技術(shù)積累,,發(fā)展更是困難,所以人才積累的少,,而且這些人都很忙,,在加上現(xiàn)在學(xué)校教育約束,即使他們想去高校教授游戲課程也是不可能,,何況人家都不愿意去,,這樣中國積累的人才更少) 所以你要系統(tǒng)學(xué)習(xí)游戲中圖形學(xué)理論。 這里我經(jīng)歷了游戲?qū)W習(xí)編程一次比較大的挫敗,,當(dāng)時(shí)自己是初學(xué)者,,問過很多人學(xué)3D,應(yīng)該從什么入手,。很多人都說從D3D開始入手,,于是我做了。我不得不說的是,,如果你不了解3D流水線過程,,學(xué)D3D簡直是看天書,當(dāng)時(shí)我以為自己反復(fù)的看書,,寫程序,,最后會理解的,浪費(fèi)了我大量的時(shí)間,,最后還是無法靈活掌握D3D,,如果你無法掌握D3D,想做游戲可能真的很困難,。我終于認(rèn)識到,,我選擇的路是錯(cuò)誤的,那些所謂的高手難道就學(xué)D3D學(xué)過來的,?那么他們花費(fèi)的時(shí)間是可想而知的,。因?yàn)橛行┘?xì)節(jié)你無法掌握,你使用時(shí)就覺得匪夷所思,。 《3D游戲編程大師技巧》這本書是每個(gè)學(xué)3D的人都應(yīng)該看的,,這本書把顯卡硬件實(shí)現(xiàn)的功能都用軟件來做,真正讓你理解一個(gè)3D東西到最后的屏幕顯示,是一個(gè)什么樣的過程,。作者實(shí)現(xiàn)了一個(gè)軟引擎,,軟引擎就是所有的3D功能都是用代碼自己寫的,沒有用什么顯卡來做處理的引擎,。這本書是一個(gè)經(jīng)典巨著,,如果你想學(xué)3D,即使死也要把這本書弄明白,,這樣不辜負(fù)作者寫這本書留下的汗水,,寫一本書,尤其這么PERFECT,,太不容易了,,國內(nèi)人翻譯的也很出色,感謝他們,。 《3D游戲編程大師技巧》繼承了《WINDOWS游戲編程大師技巧》里面2D函數(shù),,然后3D功能以及流水線和引擎都是自己完成,這本書的代碼量要有十幾萬,,我當(dāng)時(shí)用C++重新封裝了《3D游戲編程大師技巧》代碼,,自己設(shè)計(jì)了一個(gè)面向?qū)ο蠊潭魉€模式,代碼量13W左右,,這個(gè)過程很艱辛,,這本書我看了2遍,最后一共零零散散花費(fèi)了大約9,。10個(gè)月的時(shí)間,。你會感覺你立刻升級了,HP,,MP,,CP都增長了,當(dāng)然也包括RP,,哈哈?。ú恢肋@些術(shù)語的,大家多玩玩RPG游戲吧?。?/FONT> 好東西去追求,,不要怕浪費(fèi)時(shí)間,浪費(fèi)精力,,你想想,,你得到的最后會大于你的付出,這些都不算什么,。很多人問我怎么學(xué)3D,,我建議他們不能著急,,要從學(xué)《3D游戲編程大師技巧》開始,大約要8,,9個(gè)月時(shí)間,,把每個(gè)細(xì)節(jié)都弄明白,閉上眼睛,,怎么實(shí)現(xiàn)就很清楚,,書上每一頁寫什么都很明確。他們都覺得浪費(fèi)時(shí)間,,那么這樣是永遠(yuǎn)學(xué)不好的 1 3D數(shù)學(xué)是你要攻克的 雖然你數(shù)學(xué)學(xué)的好,,但國內(nèi)的教科書還是和游戲中用的有些不同,畢竟沒有上過專門講解游戲中數(shù)學(xué)知識的課程,。這需要你系統(tǒng)學(xué)習(xí)游戲編程中數(shù)學(xué),,3*3矩陣為什么有的人用,而有的人用4*4矩陣,,為什么有的用矩陣轉(zhuǎn)置有的用矩陣的逆?!?D游戲編程大師技巧》這本書介紹的很詳細(xì),,還有一本書就是《3D數(shù)學(xué)基礎(chǔ):圖形與游戲開發(fā)》很不錯(cuò)(有中文的),先系統(tǒng)學(xué)習(xí)下,,然后在學(xué)習(xí)游戲編程時(shí),,不懂的時(shí)候,再回頭看看這些書,,把所有的東西都徹底弄清,。你如果數(shù)學(xué)基礎(chǔ)好,學(xué)這些都很容易,,以后游戲編程中最深?yuàn)W的地方之一就是數(shù)學(xué),。 基本上我總結(jié)下,你要知道的是: 向量 4維 和 3維向量有什么不同 矩陣 4*4 和 3*3 矩陣有什么不同 四元數(shù) ELUER角 以后有機(jī)會深入研究碰撞中的各種算法,,還會遇到很多關(guān)于數(shù)學(xué)的問題,,上面只是渲染有關(guān)系。 2 3D流水線的實(shí)現(xiàn)過程 我無法用言語來表明這個(gè)過程的重要性,,整個(gè)3D流水線是是3D游戲的脊柱,,你的基礎(chǔ)知識牢固與否,主要看你這里,。3D流水線每一個(gè)細(xì)節(jié)我希望大家都要搞清楚,,這個(gè)過程對初學(xué)者是要花費(fèi)大量的時(shí)間專研與琢磨,D3D的固定流水線都是由硬件完成,,如果你的硬件不支持,,它會用軟件模擬,,好,關(guān)鍵就在這里,,軟件模擬是怎么回事,,而《3D游戲編程大師技巧》的流水線是自己用C語言寫的,也就是用軟件完成,,這樣你能了解整個(gè)流水線的細(xì)節(jié),,同時(shí)你在學(xué)D3D時(shí),對照著來學(xué),,你會發(fā)現(xiàn),,D3D學(xué)起來很容易。現(xiàn)在D3D和硬件都支持可編程流水線,,而且DX10沒有固定流水線,,所有變換過程都用SHADER語言控制顯卡完成,這個(gè)過程是3D流水線的縮影,,所以3D流水線的重要性是是可想而知的,。 我說了這么多,3D流水線對你是一個(gè)新鮮的名詞,,我也沒有去解釋它,,我不想去解釋,完全留給你自己去,,我始終堅(jiān)持著,,我只告訴你去的路,路上有什么困難,,應(yīng)該怎么走,,你自己去體會這條路上的酸甜苦辣。我希望大家多花些時(shí)間在這上面,,真真正正的自己寫代碼實(shí)現(xiàn)一下,,基礎(chǔ)對你真的很重要,記住我說的話,,很多人學(xué)習(xí)時(shí),,認(rèn)為自己理解了,沒有去實(shí)現(xiàn),,其實(shí)還是那句話“紙上得來終覺淺,,絕知此事必躬行”,,相信我,,沒錯(cuò)的。 基本上我總結(jié)下,,你要知道的是: 3D中的頂點(diǎn)結(jié)構(gòu),,每個(gè)分量都用來干什么,,三角形是基本渲染單元,。 模型空間——》世界空間——》相機(jī)空間——》投影空間——》屏幕空間——》光柵化 這個(gè)過程和運(yùn)行原理 材質(zhì)究竟是什么? 常用的宏光照模型原理,,光源類型 光源和材質(zhì)和法向量關(guān)系 光照在哪個(gè)空間去執(zhí)行(其實(shí)不是很嚴(yán)格) 紋理尋址,,紋理映射方式,紋理混合,,紋理過濾,。 1D 2D 3D CUBE 紋理 Z 1/Z緩沖 2種相機(jī)模型 ALPHA 透明 關(guān)于光柵化三角形要特別注意,他最后混合紋理和光照顏色和ALPHA透明,,還要判斷深度緩沖,,最后是插值填寫每個(gè)象素。 3 D3D究竟要如何學(xué)習(xí) 《3D游戲編程大師技巧》和D3D流水線過程還是有些差別的,,比如在投影矩陣上,,其實(shí)它們都是大同小異,只不過表現(xiàn)形式不同,,原理都一樣,。我希望大家自己可以找出來,深刻理解里面原理,。 還有一個(gè)重要的東西,,就是哪些是D3D開發(fā)游戲必須有的,哪些是D3D自己擴(kuò)展的,。必須有的,,就是同硬件打交道的部分,,而D3D中自己擴(kuò)展了很多庫函數(shù),,例如數(shù)學(xué)庫,這個(gè)完全可以沒有,,我們自己來實(shí)現(xiàn),,還有D3D中的EFFECT接口,它自己定義的,。X文件所有函數(shù)接口,。也就是說,你要理解,,哪些是游戲開發(fā)中必須有的,,哪些是游戲開發(fā)中自己完全可以不接觸底層來實(shí)現(xiàn)的。 游戲編程中有3個(gè)緩沖區(qū),,顏色緩沖,,深度緩沖,模板緩沖,,前2個(gè)《3D游戲編程大師技巧》中,,都詳細(xì)的介紹,,而模板對初學(xué)者可能很晦澀,大家先弄明白模板的機(jī)制,,然后多看些例子,,我想你會深刻理解它的含義的。 D3D的學(xué)習(xí),,可以看D3D SDK的例子,,也可以找一些書籍,很多的,。 基本上我總結(jié)下,,你要知道的是: D3D提供基本常用底層接口,那些是是D3D為了編程必須提供的,,那些是不用提供的,,比如數(shù)學(xué)庫我們完全可以自己寫。 D3D頂點(diǎn) 索引BUFFER 顏色緩沖,,模版緩沖,,深度緩沖 以及對這些緩沖的操作 目標(biāo)渲染對象、 D3D 中的3D流水線 單通道渲染,,多通道渲染,。 熟練操作上面的所有,這些都足夠了,,其他的都是D3D中多余的,,如果你要自己做引擎,很多都要自己實(shí)現(xiàn),,當(dāng)然初學(xué)者可以就用它擴(kuò)展的函數(shù)庫,,也很方便的。 4 其他要知道的游戲知識 下面知識都屬于很強(qiáng)的游戲技術(shù)范疇,,他們只屬于單單游戲中技術(shù)支持,,引擎就是用合理的方式,把所有3D相關(guān)包括流水線和下面這些都整和到一起,,但這種整和是有效的管理,。 場景管理算法 :BSP OCTREE QUADTREE PORTAL PVS 動(dòng)畫系統(tǒng) :骨骼動(dòng)畫,蒙皮骨骼動(dòng)畫,,漸變動(dòng)畫,,和這些動(dòng)畫的混合 陰影 :陰影體 投影陰影 陰影影射 剔除算法 :包圍球 OBB AABB BHV算法 LOD系統(tǒng) :視點(diǎn)無關(guān)LOD 視點(diǎn)相關(guān)LOD 廣告牌 :跟蹤相機(jī)方向 和 只圍繞y軸旋轉(zhuǎn) 粒子系統(tǒng) 這些是比較常用的,常常碰到的,,根據(jù)基本的顏色運(yùn)算,,空間運(yùn)算還能衍生出很多游戲特效,等待你自己去看書,,去解決,。 七,。3D引擎編程,令你的挑戰(zhàn)達(dá)到了極限 就象我前面說的,,引擎沒有嚴(yán)格定義劃分,,但對于當(dāng)代的引擎,似乎大家都趨向于越好的東西,,越健壯的支持,,才稱上引擎。現(xiàn)在游戲玩家對畫面擬真程度要求很高,,這就要求引擎能更好的處理3D世界中大量數(shù)據(jù),,一個(gè)好的引擎,起碼要做到以下幾點(diǎn)(引用《3D.Game.Engine.Architecture.Engineering.RealTime.Applications.with.Wild.Magic》里面的話) 1,。如何把3D世界中大量數(shù)據(jù),,讓它實(shí)時(shí)快速處理。 2,。引擎中的渲染器(用來管理數(shù)據(jù),,進(jìn)行渲染處理的)接口應(yīng)該怎么定義。 3,。如何讓使用引擎的人,,能很容易的使用引擎。 4,。當(dāng)引擎中添加新特性時(shí),,如果讓引擎改動(dòng)最小。 我感覺這4句話,,概括的很精辟,,如果讓我來概括,好象我現(xiàn)在還沒這個(gè)能力,。這是一個(gè)當(dāng)代引擎的新的定義,,雖然不是全面,,但它一語道破天機(jī),,如果你的引擎能達(dá)到上面4點(diǎn),我想它已經(jīng)足夠的優(yōu)秀,,同時(shí)說明你也很優(yōu)秀了,。下面我就分別解刨這4句話,讓大家對引擎有一個(gè)深刻的了解,。我只是分析,,這4句話要求高手才可以完全去達(dá)到,我現(xiàn)在還不具備這個(gè)能力,,所以只能幫大家分析,。 1,。如何把3D世界中大量數(shù)據(jù),讓它實(shí)時(shí)快速處理,。 3D世界中充滿了大量得數(shù)據(jù),,有效的處理只可以看見的,能感受到的就可以了,。 3D引擎中,,很多時(shí)候都在處理剪裁和剔除的問題,把不可見的或者和碰撞無關(guān)的數(shù)據(jù)用最快的方法弄掉,,不讓它進(jìn)入顯卡,,一切還是停留在3D空間中。剪裁,,剔除還有碰撞處理,,永遠(yuǎn)是3D引擎中最常見的話題,現(xiàn)在有很多成型的方法,,大家自己通過學(xué)習(xí)就可以了解的,。 2。引擎中的渲染器(用來管理數(shù)據(jù),,進(jìn)行渲染處理的)接口應(yīng)該怎么定義,。 即使你把3D數(shù)據(jù)給了顯卡,還是不能達(dá)到最快顯示,,我們要把這些數(shù)據(jù)分類,,重新組織,這里面還涉及到存儲管理的問題,。你的渲染器的接口要定義的和底層提供的DX或者OPGL相通,,因?yàn)樽詈竽阋{(diào)用的是這2個(gè)庫里面的函數(shù)。 3,。如何讓使用引擎的人,,能很容易的使用引擎。 這是一個(gè)經(jīng)驗(yàn)問題,,一個(gè)軟件設(shè)計(jì)給用戶使用,,怎么讓用戶很容易上手。但無論什么樣的用戶,,你必須對3D有了解才可以使用,,否則神仙也沒法完成這個(gè)引擎。 4,。當(dāng)引擎中添加新特性時(shí),,如果讓引擎改動(dòng)最小。 經(jīng)常說的一句話就是“計(jì)劃沒有變化快”,怎么能讓引擎跟上時(shí)代的步伐,,當(dāng)硬件有革新,,我們引擎就有革新,出現(xiàn)新的處理方法,,引擎也要改進(jìn),,用戶需求改變,引擎接口也要改變,,我們要求引擎的所有改動(dòng)最小,,這樣才是一個(gè)完美的引擎。 引擎是軟件設(shè)計(jì)+算法+編程的結(jié)合體,,難點(diǎn)在軟件設(shè)計(jì)上,,一個(gè)好的引擎,代碼幾百萬很正常,,沒有一個(gè)好的設(shè)計(jì)來規(guī)范它們,,混亂是不可避免的。 對于一個(gè)引擎,,從設(shè)計(jì)到編程都很重要,,一個(gè)人完成一個(gè)好的引擎是不可能的,多人協(xié)作來完成引擎,,在大家相互配合的同時(shí),,每個(gè)人對自己的要完成的任務(wù)必須精通,還要有人協(xié)調(diào)這些工作,。 好的引擎,,要有一個(gè)抽象層次,然后是渲染API層次,,還要支持多操作系統(tǒng)平臺,,我在這里沒有過多介紹各種技術(shù)細(xì)節(jié),因?yàn)楹芏嗉?xì)節(jié)在書中都可以找到,,加上你的聰明,,很多技術(shù)算法可以自己創(chuàng)造的。 對于游戲中大量算法,,引擎中到處都是,,碰撞,場景管理,,光照,,紋理混合,,動(dòng)畫系統(tǒng),,粒子系統(tǒng),內(nèi)存管理,資源管理等等大家要多實(shí)踐,,多思考,,多看書,多看資料,,把握每一個(gè)細(xì)節(jié),,把握每一個(gè)整體??磿鴷r(shí)要帶著問題去看,,同時(shí)也要帶出問題,因?yàn)闆]有一個(gè)方法是完美的,,必定會有或多或少的缺陷,。 現(xiàn)在開源的引擎確實(shí)不少,其實(shí)程序員都有一個(gè)共性,,看別人代碼有時(shí)不如自己寫,,確實(shí)這樣,有時(shí)只看代碼去體會別人的思想真的很難,,但有時(shí)為了去學(xué)習(xí)也要硬著頭皮去看的,,跟蹤代碼。開始時(shí),,如果你不了解引擎究竟是什么,,這時(shí)最好集中看一個(gè)開源引擎,一定要把它的工作原理都弄明白,,這樣你會得到很大的提升,,你就會明白引擎是什么,為什么不用D3D直接編寫游戲,,還有一點(diǎn)就是,,有機(jī)會一定要去實(shí)現(xiàn),這樣你的體會會更深,。 八 淺談物理與人工智能 這2個(gè)都不是中國游戲中的優(yōu)勢,,它們和圖形一樣,要求一定能力積累才可以勝任,。如果我沒有預(yù)測的話,,未來中國游戲中大量的需求將來自物理和人工智能,傳統(tǒng)的網(wǎng)絡(luò)RPG會慢慢不能滿足大家需要,,而被時(shí)代所拋棄的,。 這2方面的編程我只是略知一二,還算一個(gè)小白,,在此簡單談?wù)劇?/FONT> 10,。1 物理 游戲中大部分物理模擬都集中在力學(xué)和運(yùn)動(dòng)學(xué)上,本來它們就是一個(gè)整體。因?yàn)樽詈笮Ч谴蠹铱吹降?,而看到的都是物體在屏幕上的移動(dòng),,所以所有的計(jì)算最終都?xì)w結(jié)到物體移動(dòng)上。 因?yàn)橛螒虍吘故怯螒?,人也畢竟是人,,沒有必要模擬的那么精確,同時(shí)人也是感覺不出來的,。 所以要想做好物理上的編程,,必須對力學(xué)和運(yùn)動(dòng)學(xué)有系統(tǒng)的了解,高中學(xué)的力學(xué)部分還不是很足夠,,對于旋轉(zhuǎn)部分,,也就是處理力矩和轉(zhuǎn)動(dòng)慣量上,高中物理書都沒有講(我那時(shí)是沒有講,,而且很多直線線形運(yùn)動(dòng)方程推倒其實(shí)是用微積分推倒的,,高中書上都沒有明確推倒) 物理上的模擬也沒有逃脫物理計(jì)算基本規(guī)則,先是受力分析,,然后計(jì)算合力,,計(jì)算加速度,計(jì)算速度,,最后計(jì)算位置,,也可能涉及到動(dòng)能和動(dòng)量等知識,還有些流體力學(xué)等等吧,。 物理其實(shí)處理的問題基本就是檢測物體碰撞,,碰撞后的反映,物體運(yùn)動(dòng)情況,。 至于理論,,大家弄本大學(xué)物理,力學(xué)部分就足夠,,如果數(shù)學(xué)好的話加上高中的物理知識,,應(yīng)該學(xué)起來不難的。 《游戲開發(fā)物理學(xué)》這本書很好,,可惜絕版了,,但有電子版的,也有中文版,。 10,。2 AI 相對物理的編程書籍來說,AI的書很多,。 AI是研究生必須學(xué)的課程,,包括傳統(tǒng)的AI和計(jì)算智能,。游戲中常用的傳統(tǒng)AI包括自動(dòng)機(jī)理論,A* 算法,,回溯,,圖搜索,,剪枝等等吧,。計(jì)算智能包括的是:遺傳算法,模糊計(jì)算,,人工神經(jīng)網(wǎng)絡(luò),。 我答UBI筆試的時(shí)候,里面很多題都是A*算法,,可見FPS游戲中大量存在的都是AI的路徑搜索問題,,讓電腦更加智能。 AI的游戲編程書很多,,我就看過幾本,。《WINDOWS游戲編程》中有一部分講的AI,,《游戲開發(fā)中人工智能》 《游戲編程中的人工智能技術(shù)》這3本都有中文的,,而且都有大量的實(shí)例,對于那些大量理論的書籍來說,,看看它們還是很通俗的,。還有很多好書,都是英文的,。 |
|