日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何学好3D游戏引擎编程.txt

發布時間:2023/12/29 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何学好3D游戏引擎编程.txt 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
此文為轉載,但是值得一看。


此篇文章獻給那些為了游戲編程不怕困難的熱血青年,它的神秘要我永遠不間斷的去挑戰自我,超越自我,這樣才能攀登到游戲技術的最高峰 ??


? ? ? ? ——阿哲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本都有中文的,而且都有大量的實例,對于那些大量理論的書籍來說,看看它們還是很通俗的。還有很多好書,都是英文的。

總結

以上是生活随笔為你收集整理的如何学好3D游戏引擎编程.txt的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。