關於doom的研究

轉自 http://bbs.game798.com/showtopic-21382.html

 

關於doom的研究
脫去Doom3的美麗外衣 Doom3遊戲引擎解析
  Doom3,一個如雷貫耳的名字,在這個名字之下,隱藏了遊戲引擎設計大師約翰·卡馬克所宣稱的5年之內都不會被淘汰的頂級遊戲圖形技術。當人們還在驚歎於遊戲截圖的驚人效果時,Doom3正式版已於8月3日擺上了貨架。究竟是哪些圖形技術造就了Doom3驚人的視覺效果?或許跟隨我們,您可以在本文找到冰山一角。

  動態光源照明是Doom3引擎的基礎,這一特性並非新技術,但不得不強調是因爲Doom3徹底的使用了動態光源照明技術——《毀滅戰士III》(Doom3)根本沒有環境亮度這一概念——不知Doom3引擎設計就是如此,還是“人爲”的關閉了環境亮度。但請記住一點,我們在Doom3中看見的每一樣東西都是用實時光源照亮的。
  熟悉遊戲引擎的玩家可能會有疑問:環境亮度不就是靠一個距離無限遠的無衰減平行光源實現的麼?PLAY!LAB想指出的是,動態光源之所以了不起,在於光源的數量。當一個環境中有多個光源時,環境中每一頂點的亮度運算就會複雜很多倍,能處理好多個光源的同時照明並不容易!

超厚貼圖技術

  首先聲明,“超厚”這個說法是筆者惡搞的^^
  之所以能稱之爲“超厚”,是因爲Doom3採用了以往遊戲中從來沒有過的超多層紋理技術!在最誇張的情況下,Doom3的場景中某個物體的表面可能被貼上5層以上的紋理——這絕對是一個讓人難以置信的數字!因爲以往的遊戲一般都採用雙層紋理技術,即使在極限情況下也只可能會有3層紋理。這個Doom3究竟“貼”了些什麼呢,讓我們一起來看個究竟:

  法線貼圖(NormalMap)是遊戲中的基礎。和大多數遊戲中的技術前進方向背道而馳,Doom3的標準紋理並不精緻,甚至可以說是粗糙。而且,粗糙也就算了,上面還有一些奇怪的色塊、條紋什麼的,乍一看還真是覺得不習慣。當然,id這麼做自然是有其目的,這就是Doom3引以爲傲的全局內積凹凸貼圖技術!也就是現在統稱的法線貼圖
  法線貼圖是基於獨立象素光照(Per Pixel Lighting)技術的一項應用。凹凸貼圖的概念是不使用幾何數據(多邊形,十分佔用顯卡、系統資源),而使用額外的“法線圖”來構成物體表面的凹凸感。理論上,“法線”是垂直於特定平面的向量,用以記錄反射光線的角度。內積凹凸貼圖對三角形上的每個像素賦予假的法線,因此反射不是按照真正的多邊形計算,而是根據法線圖表面的向量計算出來。最終生成凹凸貼圖的效果,讓一塊並非真實凹凸的區域看起來有3D的感覺。

  這一效果的實現需要一層額外的紋理。這層紋理和NormalMap不同,其中記錄的不是色彩信息,而是紋理中每一個點的法線方向,如圖1。最終渲染圖形時,根據圖中向量提供的方向信息,就可以生成一幅凹凸有致的畫面。有得必有失,採用這種技術的缺點是每當採用凹凸貼圖的面發生變化時(角度、玩家視角、光源位置等出現變化),就需要根據“法線圖”重新繪製凹凸貼圖。

全方位介紹
  自Doom遊戲時代以來我們已經走了很遠。 DOOM不只是一款偉大的遊戲,它同時也開創了一種新的遊戲編程模式: 遊戲 "引擎"。 這種模塊化,可伸縮和擴展的設計觀念可以讓遊戲玩家和程序設計者深入到遊戲核心,用新的模型,場景和聲音創造新的遊戲, 或向已有的遊戲素材中添加新的東西。大量的新遊戲根據已經存在的遊戲引擎開發出來,而大多數都以ID公司的Quake引擎爲基礎, 這些遊戲包括Counter Strike, Team Fortress, Tac Ops, Strike Force, 以及Quake Soccer。Tac Ops 和Strike Force 都使用了Unreal Tournament 引擎。事實上, "遊戲引擎" 已經成爲遊戲玩家之間交流的標準用語,但是究竟引擎止於何處,而遊戲又從哪裏開始呢?像素的渲染,聲音的播放,怪物的思考以及遊戲事件的觸發,遊戲中所有這一切的幕後又是什麼呢? 如果你曾經思考過這些問題, 而且想要知道更多驅動遊戲進行的東西,那麼這篇文章正好可以告訴你這些。 本文分多個部分深入剖析了遊戲引擎的內核, 特別是Quake引擎,因爲我最近工作的公司Rxxen Software已經在Quake引擎的基礎上開發出了多款遊戲,其中包括著名的Soldier of Fortune 。 

開始
  讓我們首先來看看一個遊戲引擎和遊戲本身之間的主要區別。 許多人們會混淆遊戲引擎和整個遊戲 。這有點像把一個汽車發動機和整個汽車混淆起來一樣 。 你能夠從汽車裏面取出發動機, 建造另外一個外殼,再使用發動機一次。 遊戲也像那。 遊戲引擎被定義爲所有的非遊戲特有的技術。 遊戲部份是被稱爲 '資產' 的所有內容 (模型,動畫,聲音,人工智能和物理學)和爲了使遊戲運行或者控制如何運行而特別需要的程序代碼, 比如說AI--人工智能。 
  對於曾經看過 Quake 遊戲結構的人來說, 遊戲引擎就是 Quake。exe ,而遊戲部分則是 QAGame。dll 和 CGame。dll 。 如果你不知道這是什麼意思, 也沒有什麼關係;在有人向我解釋它以前, 我也不知道是什麼意思。 但是你將會完全明白它的意思。 這篇遊戲引擎指導分爲十一個部份。 是的, 從數量上來說,總共是十一個部份! 每個部分大概3000字左右。現在就從第一部分開始我們的探索吧,深入我們所玩遊戲的內核,在這裏我們將瞭解一些基本的東西, 爲後面的章節作鋪墊。。。

渲染器
  讓我們從渲染器來開始遊戲引擎設計的探討吧, 我們將從遊戲開發者(本文作者的背景)的角度來探討這些問題。事實上,在本文的各個段落,我們將常常從遊戲開發者的角度探討, 也讓您像我們一樣思考問題! 
  什麼是渲染器,爲什麼它又這麼重要呢?好吧,如果沒有它,你將什麼也看不到。它讓遊戲場景可視化,讓玩家/觀衆可以看見場景,從而讓玩家能夠根據屏幕上所看到的東西作出適當的決斷。 儘管我們下面的探討可能讓新手感到有些恐懼,先別去理會它。 渲染器做些什麼?爲什麼它是必須的?我們將會解釋這些重要問題。 
  當構造一個遊戲引擎的時候, 你通常想做的第一件事情就是建造渲染器。 因爲如果看不見任何東西 – 那麼你又如何知道你的程序代碼在工作呢? 超過 50% 的 CPU 處理時間花費在渲染器上面; 通常也是在這個部分,遊戲開發者將會受到最苛刻的評判。 如果我們在這個部分表現很差,事情將會變得非常糟糕, 我們的程序技術,我們的遊戲和我們的公司將在 10 天之內變成業界的笑話。 它也是我們最依賴於外部廠商和力量的地方,在這裏他們將處理最大限度的潛在操作目標。 如此說來, 建造一個渲染器確實不象聽起來那麼吸引人(事實如此), 但如果沒有一個好的渲染器, 遊戲或許永遠不會躋身於排行榜前10 名。 
  如今,在屏幕上生成像素,涉及到 3D 加速卡, API ,三維空間數學, 對 3D 硬件如何工作的理解等等。對於主機(遊戲機)遊戲來說,也需要相同類型的知識,但是至少對於主機, 你不必去嘗試擊中一個移動中的目標。 因爲一臺主機的硬件配置是固定的 "時間快照", 和PC(個人計算機)不同, 在一臺主機的生命期中,它的硬件配置不會改變。 
  在一般意義上,渲染器的工作就是要創造出遊戲的視覺閃光點,實際上達到這個目標需要大量的技巧。3D圖形本質上是用最少的努力創造出最大效果的一門藝術, 因爲額外的 3D 處理在處理器時間和和內存帶寬方面都是極爲昂貴的。 它也是一種預算, 要弄清楚你想在什麼地方花費處理器時間,而你寧願在什麼地方節省一些從而達到最好的整體效果。 接下來我們將會介紹一些這方面的工具,以及怎樣更好的用它們讓遊戲引擎工作。

建造3D世界
  最近,當我和一位從事計算機圖形方面工作長達數年之久的人會談時,她向我吐露道, 當她第一次看到實時操縱計算機 3D 圖象時, 她不知道這是怎麼實現的, 也不知道計算機如何能夠存儲 3D 圖象。 今天這對於在大街上的普通人來說或許是真實的,即使他們時常玩 PC 遊戲, 遊戲機遊戲, 或街機遊戲。
  下面我們將從遊戲設計者的角度討論創造 3D 世界的一些細節,你也應該看一看 Dxxe Salvator 所寫的“3D 管線導論“,以便對3D 圖象生成的主要過程有一個整體的瞭解。
  3D 物體(對象)被儲存成 3D 世界中的一系列點(被稱爲頂點), 彼此之間有相互關係,所以計算機知道如何在世界中的這些點之間畫線或者是填充表面。 一個立方體由8個點組成,每個角一個點。立方體有6個表面, 分別代表它的每一個面。 這就是 3D 對象儲存的基礎。 對於一些比較複雜的 3D 物體, 比如說一個 Quake 的關卡,將有數以千計(有時數以十萬計)的頂點, 和數以千計的多邊形表面。 
  參見上圖的線框表示(注:原文在這裏有一幅圖)。 本質上與上面的立方體例子類似, 它僅僅是由許許多多的小多邊形組成的一些複雜場景。模型和世界如何儲存是渲染器的一部份功能, 而不屬於應用程序/遊戲部份。 遊戲邏輯不需要知道對象在內存中如何表示, 也不需要知道渲染器將怎樣把他們顯示出來。 遊戲只是需要知道渲染器將使用正確的視野去表示對象, 並將在正確的動畫幀中把正確的模型顯示出來。
  在一個好的引擎中,渲染器應該是可以完全被一個新的渲染器替換掉, 並且不需要去改動遊戲的一行代碼。許多跨平臺引擎, 而且許多自行開發的遊戲機引擎就是這樣的,如 Unreal 引擎, --舉例來說, 這個遊戲 GameCube 版本的渲染器就可以被你任意的替換掉。 
  讓我們再看看內部的表示方法—除了使用座標系統,還有其他方法可以在計算機內存裏表示空間的點。在數學上,你可以使用一個方程式來描述直線或曲線, 並得到多邊形, 而幾乎所有的 3D 顯示卡都使用多邊形來作爲它們的最終渲染圖元。 一個圖元就是你在任何顯示卡上面所能使用的最低級的繪製(渲染)單位,幾乎所有的硬件都是使用三個頂點的多邊形(三角形)。 新一代的 nVidia 和 ATI 顯卡可以允許你以數學方式渲染(被稱爲高次表面), 但因爲這不是所有圖形卡的標準, 你還不能靠它作爲渲染策略。
  從計算的角度來看,這通常有些昂貴,但它時常是新的實驗技術的基礎,例如,地表的渲染,或者對物件銳利的邊緣進行柔化。 我們將會在下面的曲面片小節中更進一步介紹這些高次表面。

剔除概觀
  問題來了。 我現在有一個由幾十萬個頂點/多邊形描述的世界。 我以第一人稱視角位於我們這個 3D 世界的一邊。 在視野中可以看見世界的一些多邊形, 而另外一些則不可見, 因爲一些物體, 比如一面看得見的牆壁, 遮擋住了它們。 即使是最好的遊戲編碼人員, 在目前的 3D 顯卡上, 在一個視野中也不能處理 300,000個三角形且仍然維持 60fps (一個主要目標)。 顯卡不能處理它, 因此我們必須寫一些代碼,在把它們交給顯卡處理之前除去那些看不見的多邊形。 這個過程被稱爲剔除。
  有許多不同的剔除方法。 在深入瞭解這些之前,讓我們探討一下爲什麼圖形顯示卡不能處理超高數量的多邊形。 我是說,最新的圖形卡每秒鐘不能處理幾百萬個多邊形嗎?它不應該能夠處理嗎? 首先,你必須理解市場銷售宣稱的多邊形生成率和真實世界的多邊形生成率。 行銷上宣稱的多邊形生成率是圖形顯示卡理論上能夠達到的多邊形生成率。 
  如果全部多邊形都在屏幕上, 相同的紋理,相同的尺寸大小, 正在往顯示卡上傳送多邊形的應用程序除了傳送多邊形以外什麼也不做, 這時顯卡能處理多少多邊形數量, 就是圖形芯片廠商呈現給你的數字。 
  然而,在真實的遊戲情形中,應用程序時常在後臺做着許多其他的事情 -- 多邊形的 3D 變換, 光照計算, 拷貝較多的紋理到顯卡內存, 等等。 不僅紋理要送到顯示卡, 而且還有每個多邊形的細節。一些比較新的顯卡允許你實際上在顯卡內存本身裏面儲存模型/世界幾何細節, 但這可能是昂貴的,將會耗光紋理正常可以使用的空間,所以你最好能確定每一幀都在使用這些模型的頂點, 否則你只是在浪費顯示卡上的存儲空間。 我們就說到這裏了。 重要的是,在實際使用顯卡時,並不必然就能達到你在顯卡包裝盒上所看到的那些指標,如果你有一個比較慢速的CPU , 或沒有足夠的內存時,這種差異就尤爲真實。

基本的剔除方法
  最簡單的剔除方式就是把世界分成區域, 每個區域有一個其他可見區域的列表。 那樣, 你只需要顯示針對任何給定點的可見部分。 如何生成可見視野區域的列表是技巧所在。 再者, 有許多方法可以用來生成可見區域列表, 如 BSP 樹, 窺孔等等。 
  可以肯定,當談論 DOOM 或 QUAKE 時,你已經聽到過使用 BSP 這個術語了。 它表示二叉空間分割。 
  BSP 是一種將世界分成小區域的的方法,通過組織世界的多邊形,容易確定哪些區域是可見的而哪些是不可見的 – 從而方便了那些不想做太多繪製工作的基於軟件的渲染器。它同時也以一種非常有效的方式讓你知道你位於世界中的什麼地方。 
  在基於窺孔的引擎 ( 最早由 3D Realms 已經取消的 Prey 項目引入遊戲世界 )裏,每個區域 ( 或房間) 都建造有自己的模型, 通過每個區域的門 ( 或窺孔 )能夠看見另外的區段。 渲染器把每個區域作爲獨立的場景單獨繪製。 這就是它的大致原理。 足以說這是任何一個渲染器的必需部份,而且非常重要。 
  儘管一些這樣的技術歸類在 "遮擋剔除"之下,但是他們全部都有同樣的目的: 儘早消除不必要的工作。 對於一個FPS遊戲(第一人稱射擊遊戲) 來說,視野中時常有許多三角形,而且遊戲玩家承擔視野的控制,丟棄或者剔除不可見的三角形就是絕對必要的了。 對空間模擬來說也是這樣的, 你可以看見很遠很遠的地方 – 剔除超過視覺範圍外面的東西就非常重要。 對於視野受到限制的遊戲來說 – 比如 RTS (即時戰略類遊戲)--通常比較容易實現。 通常渲染器的這個部份還是由軟件來完成, 而不是由顯卡完成, 由顯卡來做這部分工作只是一個時間問題。

基本的圖形管線流程
  一個簡單的例子,從遊戲到多邊形繪製的圖形管線過程大致是這樣:
  • 遊戲決定在遊戲中有哪些對象, 它們的模型, 使用的紋理, 他們可能在什麼動畫幀,以及它們在遊戲世界裏的位置。 遊戲也決定照相機的位置和方向。
  • 遊戲把這些信息傳遞給渲染器。以模型爲例 ,渲染器首先要查看模型的大小 ,照相機的位置, 然後決定模型在屏幕上是否全部可見, 或者在觀察者 (照相機視野) 的左邊,在觀察者的後面,或距離很遠而不可見。它甚至會使用一些世界測定方式來計算出模型是否是可見的。 (參見下面這條)
  • 世界可視化系統決定照相機在世界中的位置,並根據照相機視野決定世界的哪些區域 / 多邊形是可見的。有許多方法可以完成這個任務, 包括把世界分割成許多區域的暴力方法,每個區域直接爲"我能從區域 D 看見區域 AB & C", 到更精緻的 BSP(二叉空間分割)世界。 所有通過這些剔除測試的多邊形被傳遞給多邊形渲染器進行繪製。 
  • 對於每一個被傳遞給渲染器的多邊形, 渲染器依照局部數學 ( 也就是模型動畫) 和世界數學(相對於照相機的位置?)對多邊形進行變換,並檢查決定多邊形是不是背對相機 (也就是遠離照相機)。背面的多邊形被丟棄。 非背面的多邊形由渲染器根據發現的附近燈光照亮。然後渲染器要看多邊形使用的紋理,並且確定 API/ 圖形卡正在使用那種紋理作爲它的渲染基礎。 在這裏,多邊形被送到渲染 API,然後再送給顯卡。 
  很明顯這有些過分簡單化了,但你大概理解了。 下面的圖表摘自Dxxe Salvator's 3D 管線一文,可以給你多一些具體細節: 
  3D 管線
  - 高層的概觀
  1. 應用程序/ 場景
  •場景/ 幾何數據庫遍歷
  •對象的運動,觀察相機的運動和瞄準
  •對象模型的動畫運動
  •3D 世界內容的描述
  •對象的可見性檢查,包括可能的遮擋剔除
  •細節層次的選擇 (LOD)
  2. 幾何
  •變換 (旋轉,平移, 縮放)
  •從模型空間到世界空間的變換 (Direct3D)
  •從世界空間到觀察空間變換
  •觀察投影
  •細節接受/ 拒絕 剔除
  •背面剔除 (也可以在後面的屏幕空間中做)
  光照
  •透視分割 - 變換到裁剪空間
  •裁剪
  •變換到屏幕空間
  3. 三角形生成
  •背面剔除 ( 或者在光照計算之前的觀察空間中完成)
  •斜率/ 角度計算
  •掃瞄線變換
  4. 渲染 / 光柵化
  •着色
  •紋理
  •霧
  •Alpha 透明測試
  •深度緩衝
  •抗鋸齒 (可選擇的)
  •顯示
  通常你會把所有的多邊形放到一些列表內, 然後根據紋理對這個列表排序(這樣你只需要對顯卡傳送一次紋理, 而不是每個多邊形都傳送一次), 等等。在過去,會把多邊形按照它們到相機的距離進行排序,首先繪製那些距離相機最遠的多邊形, 但現在由於 Z 緩衝的出現,這種方法就不是那麼重要了。 當然那些透明的多邊形要除外,它們要在所有的非半透明多邊形繪製之後才能夠繪製 ,這樣一來,所有在它們後面的多邊形就能正確地在場景中顯現出來。 當然,象那樣,實際上你必須得從後到前地繪製那些多邊形。 但時常在任何給定的 FPS 遊戲場景中, 通常沒有太多透明的多邊形。 它可能看起來像有,但實際上與那些不透明的多邊形相比,其比率是相當低的。 
  一旦應用程序將場景傳遞到 API, API 就能利用硬件加速的變換和光照處理 (T&L), 這在如今的 3D 顯卡中是很平常的事情。 這裏不討論涉及到的矩陣數學(參見Dxxe的 3D 管線導論),幾何變換允許 3D 顯卡按照你的嘗試,根據相機在任何時間的位置和方向,在世界的正確角度和位置繪製多邊形。 
  對於每個點或頂點都有大量的計算, 包括裁剪運算,決定任何給定的多邊形實際上是否可見,在屏幕上完全不可見或部分可見。 光照運算,計算紋理色彩明亮程度,這取決於世界的燈光從什麼角度如何投射到頂點上。 過去,處理器處理這些計算,但現在,當代圖形硬件就能爲你做這些事情, 這意謂着你的處理器可以去做其他的事情了。很明顯這是件好事情 (tm) ,由於不能指望市面上所有的 3D 顯卡板上都有T & L, 所以無論如何你自己將必須寫所有的這些例程 (再一次從遊戲開發者角度來說)。 你將在本文各處的不同段落看到 "好事情 ( tm)" 這個詞彙。 我認爲,這些特徵爲使遊戲看起來更好作出了非常有用的貢獻。 毫不令人喫驚,你也將會看見它的對立面;你猜到了,那就是“壞事情 (tm)”。 我正在嘗試爭取這些詞彙的版權, 你要使用他們就得支付一筆小小的費用喲。

曲面片(高次表面)
  除了三角形,曲面片的使用現在正變得更普遍。 因爲他們能用數學表達式來描述幾何 ( 通常涉及某種曲線的幾何形體) ,而不僅僅只是列出大量的多邊形以及在遊戲世界中的位置, 所以曲面片 ( 高次表面的另一個名稱) 非常好。 這樣,你實際上就能夠動態地根據方程式來建立( 和變形 )多邊形網格, 並決定你實際想要從曲面片上看到的多邊形數量。 因此,舉例來說,你可以描述一個管道, 然後在世界中就可以有這種管道的許多樣例。 在一些房間中, 你已經顯示了 10,000個多邊形,你可以說,"因爲我們已經顯示了大量的多邊形,而且任何更多的多邊形將會使幀速率下降, 所以這個管道應該只有 100 個多邊形"。 但在另外一個房間中, 視野中只有 5,000個可見的多邊形,你可以說,"因爲我們還沒有達到預算可以顯示的多邊形數量 , 所以,現在這個管道能有 500 個多邊形"。 非常美妙的東西 --但你必須首先知道所有這些,並建立網格,這不是無足輕重的。 通過 AGP 傳送同一個對象的曲面方程確實要比傳送其大量頂點節省成本。 SOF2 就使用了這個方法的一種變體來建立它的地表系統。
  事實上現在的 ATI 顯卡具有 TruForm, 它能帶一個以三角形爲基礎的模型,並將該模型轉換爲基於高次表面的模型,使其平滑 — 接着再用十倍三角形數量把模型轉換回基於大量三角形的模型 (被稱爲retesselation)。然後模型送往管線做進一步的處理。 實際上 ATI 僅僅在 T & L 引擎之前增加了一個階段來處理這個過程。這裏的缺點是,要控制哪些模型需要被平滑處理而哪些又不需要。你常常想要一些邊緣比較尖銳, 比如鼻子,但它卻被不恰當的平滑過了。 這仍然是一種很好的技術,而且我能預見它在將來會被更多的應用。 
這就是第一部份 -- 我們將會在第二部分繼續介紹光照和紋理,下面的章節會更加深入。
第2部份: 3D環境的光照和紋理 

世界的燈光
  在變換過程中, 通常是在稱爲觀察空間的座標空間中, 我們遇到了最重要的運算之一: 光照計算。 它是一種這樣的事情, 當它工作時,你不關注它,但當它不工作時, 你就非常關注它了。有很多不同的光照方法,從簡單的計算多邊形對於燈光的朝向,並根據燈光到多邊形的方向和距離加上燈光顏色的百分比值,一直到產生邊緣平滑的燈光貼圖疊加基本紋理。而且一些 API 實際上提供預先建造的光照方法。舉例來說,OpenGL 提供了每多邊形,每頂點,和每像素的光照計算。 
  在頂點光照中,你要決定一個頂點被多少個多邊形共享,並計算出共享該頂點的所有多邊形法向量的均值(稱爲法向量),並將該法向量賦頂點。一個給定多邊形的每個頂點會有不同的法向量,所以你需要漸變或插值多邊形頂點的光照顏色以便得到平滑的光照效果。 你沒有必要用這種光照方式查看每個單獨的多邊形。 這種方式的優點是時常可以使用硬件轉換與光照(T & L)來幫助快速完成。 不足之處是它不能產生陰影。 舉例來說,即使燈光是在模型的右側,左手臂應該在被身體投影的陰影中,而實際上模型的雙臂卻以同樣的方式被照明瞭。
  這些簡單的方法使用着色來達到它們的目標。 當用平面光照繪製一個多邊形時, 你讓渲染(繪製)引擎把整個多邊形都着上一種指定的顏色。這叫做平面着色光照。 (該方法中,多邊形均對應一個光強度,表面上所有點都用相同的強度值顯示,渲染繪製時得到一種平面效果,多邊形的邊緣不能精確的顯示出來) 。
  對於頂點着色 ( Gouraud 着色) ,你讓渲染引擎給每個頂點賦予特定的顏色。 在繪製多邊形上各點投影所對應的像素時,根據它們與各頂點的距離,對這些頂點的顏色進行插值計算。 (實際上Quake III 模型使用的就是這種方法, 效果好的令人驚奇)。 
  還有就是 Phong 着色。如同 Gouraud 着色,通過紋理工作,但不對每個頂點顏色進行插值決定像素顏色值, 它對每個頂點的法向量進行插值,會爲每個頂點投影的像素做相同的工作。對於 Gouraud 着色,你需要知道哪些光投射在每個頂點上。對於 Phong 着色,你對每個像素也要知道這麼多。 
  一點也不令人驚訝, Phong 着色可以得到更加平滑的效果,因爲每個像素都需要進行光照計算,其繪製非常耗費時間。平面光照處理方法很快速, 但比較粗糙。Phong 着色比 Gouraud 着色計算更昂貴,但效果最好,可以達到鏡面高光效果("高亮")。 這些都需要你在遊戲開發中折衷權衡。

不同的燈光
  接着是生成照明映射,你用第二個紋理映射(照明映射)與已有的紋理混合來產生照明效果。這樣工作得很好, 但這本質上是在渲染之前預先生成的一種罐裝效果。如果你使用動態照明 (即,燈光移動, 或者沒有程序的干預而打開和關閉),你得必須在每一幀重新生成照明映射,按照動態燈光的運動方式修改這些照明映射。燈光映射能夠快速的渲染,但對存儲這些燈光紋理所需的內存消耗非常昂貴。你可以使用一些壓縮技巧使它們佔用較少的的內存空間,或減少其尺寸大小, 甚至使它們是單色的 (這樣做就不會有彩色燈光了),等等。 如果你確實在場景中有多個動態燈光, 重新生成照明映射將以昂貴的CPU週期而告終。 
  許多遊戲通常使用某種混合照明方式。 以Quake III爲例,場景使用照明映射, 動畫模型使用頂點照明。 預先處理的燈光不會對動畫模型產生正確的效果 -- 整個多邊形模型得到燈光的全部光照值 -- 而動態照明將被用來產生正確的效果。 使用混合照明方式是多數的人們沒有注意到的一個折衷,它通常讓效果看起來"正確"。 這就是遊戲的全部 – 做一切必要的工作讓效果看起來"正確",但不必真的是正確的。 
  當然,所有這些在新的Doom引擎裏面都不復存在了,但要看到所有的效果,至少需要 1GHZ CPU 和 GeForce 2 顯卡。是進步了,但一切都是有代價的。 
  一旦場景經過轉換和照明, 我們就進行裁剪運算。 不進入血淋淋的細節而,剪斷運算決定哪些三角形完全在場景 (被稱爲觀察平截頭體) 之內或部份地在場景之內。完全在場景之內的三角形被稱爲細節接受,它們被處理。對於只是部分在場景之內的三角形, 位於平截頭體外面的部分將被裁剪掉,餘下位於平截頭體內部的多邊形部分將需要重新閉合,以便其完全位於可見場景之內。 (更多的細節請參考我們的 3D 流水線指導一文)。
  場景經過裁剪以後,流水線中的下一個階段就是三角形生成階段(也叫做掃描 線轉換),場景被映射到2D 屏幕座標。到這裏,就是渲染(繪製)運算了。

紋理與MIP映射
  紋理在使3D場景看起來真實方面異常重要,它們是你應用到場景區域或對象的一些分解成多邊形的小圖片。多重紋理耗費大量的內存,有不同的技術來幫助管理它們的尺寸大小。紋理壓縮是在保持圖片信息的情況下,讓紋理數據更小的一種方法。紋理壓縮佔用較少的遊戲CD空間,更重要的是,佔用較少內存和3D 顯卡存儲空間。另外,在你第一次要求顯卡顯示紋理的時候,壓縮的(較小的) 版本經過 AGP 接口從 PC 主存送到3D 顯卡, 會更快一些。紋理壓縮是件好事情。 在下面我們將會更多的討論紋理壓縮。 

MIP 映射(多紋理映射)
  遊戲引擎用來減少紋理內存和帶寬需求的另外一個技術就是 MIP 映射。 MIP 映射技術通過預先處理紋理,產生它的多個拷貝紋理,每個相繼的拷貝是上一個拷貝的一半大小。爲什麼要這樣做?要回答這個問題,你需要了解 3D 顯卡是如何顯示紋理的。最壞情況,你選擇一個紋理,貼到一個多邊形上,然後輸出到屏幕。我們說這是一對一的關係,最初紋理映射圖的一個紋素 (紋理元素) 對應到紋理映射對象多邊形的一個像素。如果你顯示的多邊形被縮小一半,紋理的紋素就每間隔一個被顯示。這樣通常沒有什麼問題 -- 但在某些情況下會導致一些視覺上的怪異現象。讓我們看看磚塊牆壁。 假設最初的紋理是一面磚牆,有許多磚塊,磚塊之間的泥漿寬度只有一個像素。如果你把多邊形縮小一半, 紋素只是每間隔一個被應用,這時候,所有的泥漿會突然消失,因爲它們被縮掉了。你只會看到一些奇怪的圖像。 
  使用 MIP 映射,你可以在顯示卡應用紋理之前,自己縮放圖像,因爲可以預先處理紋理,你做得更好一些,讓泥漿不被縮掉。當 3D 顯卡用紋理繪製多邊形時,它檢測到縮放因子,說,"你知道,我要使用小一些的紋理,而不是縮小最大的紋理,這樣看起來會更好一些。" 在這裏, MIP 映射爲了一切,一切也爲了 MIP 映射。

多重紋理與凹凸映射
  單一紋理映射給整個3D 真實感圖形帶來很大的不同, 但使用多重紋理甚至可以達到一些更加令人難忘的效果。過去這一直需要多遍渲染(繪製),嚴重影響了像素填充率。 但許多具有多流水線的3D 加速卡,如ATI's Radeon 和 nVidia's GeForce 2及更高級的顯卡,多重紋理可以在一遍渲染(繪製)過程中完成。 產生多重紋理效果時, 你先用一個紋理繪製多邊形,然後再用另外一個紋理透明地繪製在多邊形上面。這讓你可以使紋理看上去在移動,或脈動, 甚至產生陰影效果 (我們在照明一節中描述過)。繪製第一個紋理映射,然後在上面繪製帶透明的全黑紋理,引起一種是所有的織法黑色的但是有一個透明分層堆積過它的頂端 , 這就是 -- 即時陰影。 該技術被稱爲照明映射 ( 有時也稱爲 暗映射),直至新的Doom ,一直是Id引擎裏關卡照明的傳統方法。 
  凹凸貼圖是最近湧現出來的一種古老技術。幾年以前 Matrox 第一個在流行的 3D 遊戲中發起使用各種不同形式的凹凸貼圖。就是生成紋理來表現燈光在表面的投射,表現表面的凹凸或表面的裂縫。 凹凸貼圖並不隨着燈光一起移動 -- 它被設計用來表現一個表面上的細小瑕疵,而不是大的凹凸。 比如說,在飛行模擬器中,你可以使用凹凸貼圖來產生像是隨機的地表細節,而不是重複地使用相同的紋理,看上去一點趣味也沒有。 
  凹凸貼圖產生相當明顯的表面細節,儘管是很高明的戲法,但嚴格意義上講,凹凸貼圖並不隨着你的觀察角度而變化。比較新的 ATI 和 nVidia 顯卡片能執行每像素運算,這種缺省觀察角度的不足就真的不再是有力而快速的法則了。 無論是哪一種方法, 到目前爲止,沒有遊戲開發者太多的使用; 更多的遊戲能夠且應該使用凹凸貼圖。

高速緩存抖動 = 糟糕的事物
  紋理高速緩存的管理遊戲引擎的速度至關重要。 和任何高速緩存一樣,緩存命中很好,而不命中將很糟糕。如果遇到紋理在圖形顯示卡內存被頻繁地換入換出的情況,這就是紋理高速緩存抖動。發生這種情況時,通常API將會廢棄每個紋理,結果是所有的紋理在下一幀將被重新加載,這非常耗時和浪費。對遊戲玩家來說,當API重新加載紋理高速緩存時,會導致幀速率遲鈍。
  在紋理高速緩存管理中,有各種不同的技術將紋理高速緩存抖動減到最少 – 這是確保任何 3D 遊戲引擎速度的一個決定性因素。 紋理管理是件好事情 – 這意味着只要求顯卡使用紋理一次,而不是重複使用。這聽起來有點自相矛盾,但效果是它意謂着對顯卡說,"看, 所有這些多邊形全部使用這一個紋理,我們能夠僅僅加載這個紋理一次而不是許多次嗎?" 這阻止API ( 或圖形驅動軟件) 上傳多次向顯卡加載紋理。象OpenGL這樣的API實際上通常處理紋理高速緩存管理,意謂着,根據一些規則,比如紋理存取的頻率,API決定哪些紋理儲存在顯卡上,哪些紋理存儲在主存。 真正的問題來了:a) 你時常無法知道API正在使用的準確規則。 b)你時常要求在一幀中繪製更多的紋理,以致超出了顯卡內存空間所能容納的紋理。 
  另外一種紋理高速緩存管理技術是我們早先討論的紋理壓縮。很象聲音波形文件被壓縮成 MP3 文件,儘管無法達到那樣的壓縮比率,但紋理可以被壓縮。 從聲音波形文件到MP3的壓縮可以達到 11:1的壓縮比率,而絕大多數硬件支持的紋理壓縮運算法則只有 4:1 的壓縮比率,儘管如此,這樣能產生很大的差別。 除此之外,在渲染(繪製)過程中,只有在需要時,硬件才動態地對紋理進行解壓縮。這一點非常棒,我們僅僅擦除即將可能用到的表面。
  如上所述,另外一種技術確保渲染器要求顯卡對每個紋理只繪製一次。確定你想要渲染(繪製)的使用相同紋理的所有多邊形同時送到顯卡,而不是一個模型在這裏,另一個模型在那裏,然後又回到最初的紋理論。僅僅繪製一次,你也就通過AGP接口傳送一次。Quake III 在其陰影系統就是這麼做的。處理多邊形時,把它們加入到一個內部的陰影列表,一旦所有的多邊形處理完畢,渲染器遍歷紋理列表,就將紋理及所有使用這些紋理的多邊形同時傳送出去。 
  上述過程在使用顯卡的硬件 T & L(如果支持的話)時,並不怎麼有效。你面臨的結局是,滿屏幕都是使用相同紋理的大量的多邊形小羣組,所有多邊形都使用不同的變換矩陣。這意謂着更多的時間花在建立顯卡的硬件 T & L 引擎 ,更多的時間被浪費了。 無論如何,因爲他們有助於對整個模型使用統一的紋理,所以它對實際屏幕上的模型可以有效地工作。但是因爲許多多邊形傾向使用相同的牆壁紋理,所以對於世界場景的渲染,它常常就是地獄。通常它沒有這麼嚴重,因爲大體而言,世界的紋理不會有那麼大,這樣一來API的紋理緩存系統將會替你處理這些,並把紋理保留在顯卡以備再次使用。 
  在遊戲機上,通常沒有紋理高速緩存系統(除非你寫一個)。在 PS2 上面,你最好是遠離"一次紋理" 的方法。在 Xbox 上面, 這是不重要的,因爲它本身沒有圖形內存(它是 UMA 體系結構),且所有的紋理無論如何始終保留在主存之中。 
  事實上,在今天的現代PC FPS 遊戲中,試圖通過AGP接口傳送大量紋理是第二個最通常的瓶頸。最大的瓶頸是實際幾何處理,它要使東西出現在它應該出現的地方。在如今的3D FPS 遊戲中,最耗費時間的工作,顯然是那些計算模型中每個頂點正確的世界位置的數學運算。如果你不把場景的紋理保持在預算之內,僅居其次的就是通過AGP接口傳送大量的紋理了。然而,你確實有能力影響這些。 通過降低頂層的 MIP 級別(還記得系統在哪裏不斷地爲你細分紋理嗎?), 你就能夠把系統正在嘗試送到顯卡的紋理大小減少一半。你的視覺質量會有所下降-- 尤其是在引人注目的電影片斷中--但是你的幀速率上升了。這種方式對網絡遊戲尤其有幫助。實際上,Soldier of Fortune II和Jedi Knight II: Outcast這兩款遊戲在設計時針對的顯卡還不是市場上的大衆主流顯卡。爲了以最大大小觀看他們的紋理,你的3D 顯卡至少需要有128MB的內存。這兩種產品在思想上都是給未來設計的。 
上面就是第 2 部份。在下面章節中,我們將介紹許多主題,包括內存管理,霧效果,深度測試, 抗鋸齒,頂點着色,API等。
第3部份: 內存使用,特效和API 

關於內存使用的思考
  讓我們想一想,在今天實際上是如何使用3D 顯卡內存的以及在將來又會如何使用。 如今絕大多數3D顯卡處理32位像素顏色,8位紅色, 8位藍色,8 位綠色,和 8 位透明度。這些組合的紅,藍和綠256個色度,可以組成 16。7 百萬種顏色-- 那是你我可以在一個監視器上看見的所有顏色。 
  那麼,遊戲設計大師John Carmack 爲什麼要求 64 位顏色分辨率呢? 如果我們看不出區別,又有什麼意義呢? 意義是: 比如說, 有十幾個燈光照射模型上的點,顏色顏色各不相同。 我們取模型的最初顏色,然後計算一個燈光的照射,模型顏色值將改變。 然後我們計算另外的一個燈光, 模型顏色值進一步改變。 這裏的問題是,因爲顏色值只有8位,在計算了4個燈光之後,8位的顏色值將不足以給我們最後的顏色較好的分辨率和表現。分辨率的不足是由量化誤差導致的,本質原因是由於位數不足引起的舍入誤差。 
  你能很快地用盡位數,而且同樣地,所有的顏色被清掉。每顏色16 或 32 位,你有一個更高分辨率,因此你能夠反覆着色以適當地表現最後的顏色。這樣的顏色深度很快就能消耗大量的存儲空間。我們也應提到整個顯卡內存與紋理內存。這裏所要說的是,每個3D 顯卡實際只有有限的內存,而這些內存要存儲前端和後端緩衝區,Z 緩衝區,還有所有的令人驚奇的紋理。最初的 Voodoo1 顯卡只有2MB顯存,後來 Riva TNT提高到16MB顯存。然後 GeForce 和 ATI Rage有32MB顯存, 現在一些 GeForce 2 到 4的顯卡和 Radeons 帶有 64MB 到128MB 的顯存。 這爲什麼重要? 好吧,讓我們看一些數字…
  比如你想讓你的遊戲看起來最好,所以你想要讓它以32位屏幕, 1280x1024分辨率和32位 Z- 緩衝跑起來。 好,屏幕上每個像素4個字節,外加每個像素4字節的Z-緩衝,因爲都是每像素32位。我們有1280x1024 個像素 – 也就是 1,310,720個像素。基於前端緩衝區和Z-緩衝區的字節數,這個數字乘以8,是 10,485,760字節。包括一個後端緩衝區,這樣是 1280x1024x12, 也就是 15,728,640 字節, 或 15MB。 在一個 16MB 顯存的顯卡上,就只給我們剩下1MB 來存儲所有的紋理。 現在如果最初的紋理是真32 位或 4字節寬,那麼我們每幀能在顯卡上存儲 1MB/4字節每像素 = 262,144個像素。這大約是4 個 256x256 的紋理頁面。 
  很清楚,上述例子表明,舊的16MB 顯卡沒有現代遊戲表現其絢麗畫面所需要的足夠內存。很明顯,在它繪製畫面的時候,我們每幀都必須重新把紋理裝載到顯卡。實際上,設計AGP總線的目的就是完成這個任務,不過, AGP 還是要比 3D 掀卡的幀緩衝區慢,所以你會受到性能上的一些損失。很明顯,如果紋理由32位降低到16位,你就能夠通過AGP以較低的分辨率傳送兩倍數量的紋理。如果你的遊戲以每個像素比較低的色彩分辨率跑, 那麼就可以有更多的顯示內存用來保存常用的紋理 (稱爲高速緩存紋理) 。 但實際上你永遠不可能預知使用者將如何設置他們的系統。如果他們有一個在高分辨率和顏色深度跑的顯卡,那麼他們將會更可能那樣設定他們的顯卡。


  我們現在開始講霧,它是某種視覺上的效果。如今絕大多數的引擎都能處理霧, 因爲霧非常方便地讓遠處的世界淡出視野,所以當模型和場景地理越過觀察體後平面進入視覺範圍內時,你就不會看見它們突然從遠處跳出來了。 也有一種稱爲體霧的技術。這種霧不是隨物體離照相機的距離而定,它實際上是一個你能看見的真實對象,並且可以穿越它,從另外一側出去 -- 當你在穿越對象的時候,視覺上霧的可見程度隨着變化。想象一下穿過雲團 -- 這是體霧的一個完美例子。體霧的一些好的實現例子是Quake III一些關卡中的紅色霧,或新的Rogue Squadron II 之 Lucas Arts的 GameCube 版本。其中有一些是我曾經見過的最好的雲--大約與你能看見的一樣真實。
  在我們討論霧化的時候,可能是簡短介紹一下 Alpha 測試和紋理Alpha混合的好時機。當渲染器往屏幕上畫一個特定像素時,假定它已經通過 Z- 緩衝測試 (在下面定義),我們可能最後做一些Alpha測試。我們可能發現爲了顯示像素後面的某些東西,像素需要透明繪製。這意味着我們必須取得像素的已有值,和我們新的像素值進行混和,並把混合結果的像素值放回原處。這稱爲讀-修改-寫操作,遠比正常的像素寫操作費時。 
  你可以用不同類型的混合,這些不同的效果被稱爲混合模式。直接Alpha混合只是把背景像素的一些百分比值加到新像素的相反百分比值上面。還有加法混合,將舊像素的一些百分比,和特定數量(而不是百分比)的新像素相加。 這樣效果會更加鮮明。 (Kyle's Lightsaber在 Jedi Knight II 中的效果)。
  每當廠商提供新的顯卡時,我們可以得到硬件支持的更新更復雜的混合模式,從而製作出更多更眩目的效果。GF3+4和最近的Radeon顯卡提供的像素操作,已經到了極限。

模板陰影與深度測試
  用模板產生陰影效果,事情就變得複雜而昂貴了。這裏不討論太多細節(可以寫成一篇單獨的文章了),其思想是,從光源視角繪製模型視圖,然後用這個把多邊形紋理形狀產生或投射到受影響的物體表面。 
  實際上你是在視野中投射將會“落”在其他多邊形上面的光體。最後你得到看似真實的光照,甚至帶有視角在裏面。因爲要動態創建紋理,並對同一場景進行多遍繪製,所以這很昂貴。 
  你能用衆多不同方法產生陰影,情形時常是這樣一來,渲染質量與產生效果所需要的渲染工作成比例。有所謂的硬陰影或軟陰影之分,而後者較好,因爲它們更加準確地模仿陰影通常在真實世界的行爲。 通常有一些被遊戲開發者偏愛的“足夠好”的方法。如要更多的瞭解陰影,請參考 Dxxe Salvator的 3D 流水線一文。

深度測試
  現在我們開始討論深度測試, 深度測試丟棄隱藏的像素,過度繪製開始起作用。過度繪製非常簡單 – 在一幀中,你數次繪製一個像素位置。它以3D場景中Z(深度)方向上存在的元素數量爲基礎,也被稱爲深度複雜度。如果你常常太多的過度繪製, -- 舉例來說, 符咒的眩目視覺特效,就象Heretic II,能讓你的幀速率變得很糟糕。當屏幕上的一些人們彼此施放符咒時,Heretic II設計的一些最初效果造成的情形是,他們在一幀中對屏幕上每個相同的像素畫了40次! 不用說,這必須調整,尤其是軟件渲染器,除了將遊戲降低到象是滑雪表演外,它根本不能處理這樣的負荷。深度測試是一種用來決定在相同的像素位置上哪些對象在其它對象前面的技術,這樣我們就能夠避免繪製那些隱藏的對象。 
  看着場景並想想你所看不見的。 換句話說,是什麼在其他場景對象前面,或者隱藏了其他場景對象? 是深度測試作出的這個決定。 
  我將進一步解釋深度深度如何幫助提高幀速率。想像一個很瑣細的場景,大量的多邊形 (或像素)位於彼此的後面,在渲染器獲得他們之間沒有一個快速的方法丟棄他們。對非Alpha混合的多邊形分類排序( 在Z- 方向上),首先渲染離你最近的那些多邊形,優先使用距離最近的像素填充屏幕。所以當你要渲染它們後面的像素(由Z或者深度測試決定)時,這些像素很快被丟棄,從而避免了混合步驟並節省了時間。如果你從後到前繪製,所有隱藏的對象將被完全繪製,然後又被其他對象完全重寫覆蓋。場景越複雜,這種情況就越糟糕,所以深度測試是個好東西。

抗鋸齒
  讓我們快速的看一下抗鋸齒。當渲染單個多邊形時,3D 顯卡仔細檢查已經渲染的,並對新的多邊形的邊緣進行柔化,這樣你就不會得到明顯可見的鋸齒形的像素邊緣。兩種技術方法之一通常被用來處理。 第一種方法是單個多邊形層次,需要你從視野後面到前面渲染多邊形,這樣每個多邊形都能和它後面的進行適當的混合。如果不按序進行渲染,最後你會看見各種奇怪的效果。在第二種方法中,使用比實際顯示更大的分辯率來渲染整幅幀畫面,然後在你縮小圖像時,尖銳的鋸齒形邊緣就混合消失了。這第二種方法的結果不錯,但因爲顯卡需要渲染比實際結果幀更多的像素,所以需要大量的內存資源和很高的內存帶寬。
  多數新的顯卡能很好地處理這些,但仍然有多種抗鋸齒模式可以供你選擇,因此你可以在性能和質量之間作出折衷。對於當今流行的各種不同抗鋸齒技術的更詳細討論請參見Dxxe Salvator 的3D 流水線一文。

頂點與像素着色
  在結束討論渲染技術之前,我們快速的說一下頂點和像素着色,最近它們正引起很多關注。頂點着色是一種直接使用顯卡硬件特徵的方式,不使用API。舉例來說,如果顯卡支持硬件 T & L ,你可以用DirectX或OpenGL編程,並希望你的頂點通過 T & L 單元 (因爲這完全由驅動程序處理,所以沒有辦法確信),或者你直接利用顯卡硬件使用頂點着色。它們允許你根據顯卡自身特徵進行特別編碼,你自己特殊的編碼使用T & L 引擎,以及爲了發揮你的最大優勢,顯卡必須提供的其他別的特徵。 事實上,現在nVidia 和ATI 在他們大量的顯卡上都提供了這個特徵。 
  不幸的是,顯卡之間表示頂點着色的方法並不一致。你不能象使用DirectX或者OpenGL 那樣,爲頂點着色編寫一次代碼就可以在任何顯卡上運行,這可是個壞消息。然而,因爲你直接和顯卡硬件交流,它爲快速渲染頂點着色可能生成的效果提供最大的承諾。( 如同創造很不錯的特效 -- 你能夠使用頂點着色以API沒有提供的方式影響事物)。事實上,頂點着色正在真的將3D 圖形顯示卡帶回到遊戲機的編碼方式,直接存取硬件,最大限度利用系統的必須知識,而不是依靠API來爲你做一切。對一些程序員來說,會對這種編碼方式感到喫驚,但這是進步代價。
  進一步闡述,頂點着色是一些在頂點被送到顯卡渲染之前計算和運行頂點效果程序或者例程。你可以在主CPU上面用軟件來做這些事情,或者使用顯卡上的頂點着色。 爲動畫模型變換網格是頂點程序的主選。
  像素着色是那些你寫的例程,當繪製紋理時,這些例程就逐個像素被執行。你有效地用這些新的例程推翻了顯卡硬件正常情況做的混合模式運算。這允許你做一些很不錯的像素效果, 比如,使遠處的紋理模糊,添加炮火煙霧, 產生水中的反射效果等。一旦 ATI 和 nVidia 能實際上就像素着色版本達成一致( DX9's 新的高級陰影語言將會幫助促進這一目標), 我一點不驚訝DirectX 和OpenGL採用Glide的方式-- 有幫助開始, 但最終不是把任何顯卡發揮到極限的最好方法。我認爲我會有興趣觀望將來。

最後(In Closing...)
  最終,渲染器是遊戲程序員最受評判的地方。在這個行業,視覺上的華麗非常重要,因此它爲知道你正在做的買單。對於渲染器程序員,最壞的因素之一就是3D 顯卡工業界變化的速度。一天,你正在嘗試使透明圖像正確地工作;第二天 nVidia 正在做頂點着色編程的展示。而且發展非常快,大致上,四年以前爲那個時代的 3D 顯卡寫的代碼現在已經過時了,需要全部重寫。 甚至John Carmack 這樣描述過,他知道四年以前爲充分發揮那個時期顯卡的性能所寫的不錯的代碼,如今很平凡 -- 因此他產生了爲每個新的id項目完全重寫渲染器的慾望。Epic 的Tim Sweeney贊同 -- 這裏是去年他給我的評論: 
  我們已經足足花費了9個月時間來更換所有的渲染代碼。最初的 Unreal 被設計爲軟件渲染和後來擴展爲硬件渲染。下一代引擎被設計爲 GeForce 及更好的圖形顯示卡,且多邊形吞吐量是Unreal Tournament的100倍。 
  這需要全部替換渲染器。很幸運,該引擎模塊化程度足夠好,我們可以保持引擎的其餘部分—編輯器,物理學,人工智能,網絡--不改動,儘管我們一直在以許多方式改進這些部分。
  搭配長篇文章的短篇報導(Sidebar):API -- 祝福和詛咒
  那麼什麼是API? 它是應用程序編程接口,將不一致的後端用一致的前端呈現出來。舉例來說,很大程度上每種3D顯示卡的3D實現方式都有所差別。然而,他們全部都呈現一個一致的前端給最終使用者或者程序員,所以他們知道他們爲X 3D顯示卡寫的代碼將會在Y 3D顯示卡上面有相同的結果。好吧,不管怎樣理論上是那樣。 大約在三年以前這可能是相當真實的陳述,但自那以後,在nVidia 公司的引領下,3D顯卡行業的事情發生了變化。 
  如今在PC領域,除非你正計劃建造自己的軟件光柵引擎,使用CPU來繪製你所有的精靈,多邊形和粒子 -- 而且人們仍然在這樣做。跟Unreal一樣,Age of Empires II: Age of Kings有一個優秀的軟件渲染器 – 否則你將使用兩種可能的圖形API,OpenGL或者 DirectX 之一。OpenGL是一種真正的跨平臺API (使用這種API寫的軟件可以在Linux,Windows和MacOS上運行。), 而且有多年的歷史了,爲人所熟知,但也開始慢慢地顯示出它的古老。 大約在四年以前,定義OpenGL驅動特徵集一直是所有顯示卡廠商工作的方向。
  然而,一旦在目標達成以後,沒有預先制定特徵工作方向的路線圖,這時候,所有的顯卡開發商開始在特徵集上分道揚鑣,使用OpenGL擴展。
  3dfx 創造了T- 緩衝。 nVidia 努力尋求硬件變換和光照計算。Matrox努力獲取凹凸貼圖。等等。 我以前說過的一句話,"過去幾年以來,3D顯示卡領域的事情發生了變化。"委婉地說明了這一切。 
  無論如何,另一個可以選擇的API是 DirectX。這受Microsoft公司控制,且在PC 和 Xbox 上被完美地支持。由於明顯的原因,DirectX 沒有Apple或者 Linux 版本。因爲Microsoft控制着 DirectX,大體上它容易更好地集成在Windows裏面。 
  OpenGL和DirectX之間的基本差別是前者由‘社區’擁有,而後者由Microsoft擁有。如果你想要 DirectX 爲你的 3D 顯示卡支持一個新的特徵,那麼你需要遊說微軟,希望採納你的願望,並等待新的 DirectX發行版本。對於OpenGL,由於顯示卡製造商爲3D顯示卡提供驅動程序,你能夠通過OpenGL擴展立即獲得顯示卡的新特徵。這是好,但作爲遊戲開發者,當你爲遊戲編碼的時候,你不能指望它們很普遍。它們可能讓你的遊戲速度提升50%,但你不能要求別人有一塊GeForce 3 來跑你的遊戲。好吧,你可以這麼做,但如果你想來年還在這個行業的話,這是個相當愚蠢的主意。
這是對這個問題極大的簡單化,對我所有描述的也有各種例外情況,但這裏一般的思想是很確實的。對於DirectX ,在任何既定時間你容易確切地知道你能從顯示卡獲得的特徵,如果一個特徵不能獲得,DirectX 將會用軟件模擬它(也不總是一件好事情,因爲這樣有時侯非常的慢,但那是另外一回事)。對於OpenGL,你可以更加貼近顯示卡的特徵,但代價是不能確定將會獲得的準確特徵。
第4部份: 模型與動畫,細節級別 

角色建模與動畫
  你的角色模型在屏幕上看起來怎麼樣,怎樣容易創建它們,紋理,以及動畫對於現代遊戲試圖完成的`消除不可信`因素來說至關重要。角色模型系統逐漸變得複雜起來, 包括較高的多邊形數量模型, 和讓模型在屏幕上移動的更好方式。
  如今你需要一個骨骼模型系統,有骨架和網格細節層次,單個頂點骨架的評估,骨架動畫忽略,以及比賽中停留的角度忽略。而這些甚至還沒有開始涉及一些你能做的很好的事情,像動畫混合,骨架反向運動學(IK),和單個骨架限制,以及相片真實感的紋理。這個清單還能夠繼續列下去。但是真的,在用專業行話說了所有這些以後,我們在這裏真正談論的是什麼呢?讓我們看看。 
  讓我們定義一個基於網格的系統和一個骨骼動畫系統作爲開始。在基於網格的系統,對於每一個動畫幀,你要定義模型網格的每個點在世界中的位置。舉例來說,你有一個包含200 個多邊形的手的模型,有 300 個頂點(注意,在頂點和多邊形之間通常並不是3個對1個的關係,因爲大量多邊形時常共享頂點 – 使用條形和扇形,你能大幅減少頂點數量)。如果動畫有 10 幀,那麼你就需要在內存中有300個頂點位置的數據。 總共有300 x 10 = 3000 頂點,每個頂點由x,y,z和顏色/alpha信息組成。你能看見這個增長起來是多麼的快。Quake I,II和 III 都使用了這種系統,這種系統確實有動態變形網格的能力,比如使裙子擺動,或者讓頭髮飄動。
  相比之下,在骨骼動畫系統,網格是由骨架組成的骨骼( 骨架是你運動的對象)。 網格頂點和骨架本身相關,所以它們在模型中的位置都是相對於骨架,而不是網格代表每個頂點在世界中的位置。因此,如果你移動骨架,組成多邊形的頂點的位置也相應改變。這意謂着你只必須使骨骼運動,典型情況大約有 50 個左右的骨架—很明顯極大地節省了內存。

骨骼動畫附加的好處
  骨骼動畫的另一個優點是能夠根據影響頂點的一些骨架來分別“估價” 每個頂點。例如,雙臂的骨架運動,肩,脖子而且甚至軀幹都能在肩中影響網格。當你移動軀幹的時候,網格就活像一個角色一樣移動。總的效果是3D角色能夠實現的動畫更加流暢和可信,且需要更少的內存。每個人都贏了。 
  當然這裏的缺點是,如果你想要使有機的東西運動且很好,比如說頭髮,或者披肩,爲了讓它看起來自然,你最後不得不在裏面放置數量驚人的骨架,這會擡高一些處理時間。 
  基於骨骼的系統能帶給你的一些其他事情是‘忽略’特定層次骨架的能力 -- 說,"我不關心動畫想要對這塊骨架所做的事情,我想要讓它指向世界中的一個特定點"。這很棒。你能讓模型着眼於世界中的事件,或者使他們的腳在他們站着的地面保持水平。這一切非常微妙,但它可以幫助帶給場景附加的真實感。
  在骨骼系統,你甚至可以指定"我需要把這個特別的動畫用於模型的腿,而一個不同的攜槍或射擊動畫在模型軀幹上播放,且那傢伙(角色)叫喊的不同動畫效果在模型的頭部播放"。非常妙。Ghoul2 ( 在Soldier of Fortune II: Double Helix and Jedi Knight I: Outcast中使用了Rxxen的動畫系統 ) 擁有所有這些好東西,且特別被設計爲允許程序員使用所有這些忽略能力。這對動畫的節省像你一樣難以相信。像你一樣的動畫上的這次救援不相信. Rxxen有一個角色行走的動畫和一個站立開火的動畫,並在它同時行走和開火形下把這兩個動畫合併,而不是需要一個動畫表示角色行走並開火。

More Skeletons in the Closet
  先前描述的效果可以通過具有層次的骨骼系統來完成。這是什麼意思呢?意思是每塊骨架實際上的位置相對於它的父親,而不是每個骨架直接位於空間中的地方。這意謂着如果你移動父親骨架,那麼它所有的子孫骨架也跟着移動,在代碼上不需要任何額外的努力。這是讓你能夠在任何骨架層次改變動畫,而且通過骨骼其餘部分向下傳遞的東西。 
  創建一個沒有層次的骨骼系統是可能的 -- 但那時你不能忽略一個骨架並且預期它工作。你所看到的只是身體上的一個骨架開始了新動畫,除非你實現了某種‘向下傳遞信息’的系統,否則在該骨架下面的其它骨架保持原來的動畫。首先由一個層次系統開始,你就自動地獲得這些效果。 
  許多今天的動畫系統中正開始出現一些比較新的特徵,如動畫混合,從一個正在播放的動畫轉變到另外一個動畫需要經過一小段時間,而不是立即從一個動畫突然轉變到另外一個。舉例來說,你有個角色在行走,然後他停了下來。你不是僅僅突然地轉變動畫,讓他的腿和腳停在無效位置,而是一秒鐘混合一半,這樣腳似乎自然地移到了新的動畫。不能夠過高的評價這種效果 -- 混合是一個微妙的事情,但如果正確的運用,它真的有些差別。

反向運動學
  反向運動學 (IK) 是被許多人們丟棄的一個專業術語,對它的真實含義沒有多少概念。IK 是如今遊戲裏面一個相對比較新的系統。使用 IK ,程序員能夠移動一隻手,或一條腿, 模型的其餘關節自動重新定位,因此模型被正確定向。而且有模型的關節新位置的其餘者他們自己,因此模型正確的被定向。比如,你將會說,"好,手 , 去拾起桌子上的那個杯子"並指出杯子在世界中的位置。手就會移動到那裏,且它後面的身體會調節其自身以便雙臂移動,身體適當彎曲,等等。
  也有和IK相反的事情,叫做前向運動學,本質上與 IK 工作的次序相反。想像一隻手,手附着在手臂上,手臂附着在身體上。現在想像你重重地擊中了身體。通常手臂像連迦般抽動,且手臂末梢的手隨之振動。 IK 能夠移動身體,並讓其餘的四肢自己以真實的方式移動。基本上它需要動畫師設定每種工作的大量信息 -- 像關節所能通過的運動範圍,如果一塊骨架前面的骨架移動,那麼這塊骨架將移動多少百分比,等等。
  和它現在一樣,儘管很好,它是一個很大的處理問題,不用它你可以有不同的動畫組合而脫身。值得注意的是,真正的 IK 解決辦法需要一個層次骨骼系統而不是一個模型空間系統 -- 否則它們都耗時太多以致無法恰當地計算每個骨架。

LOD幾何系統
  最後,我們應當快速討論一下與縮放模型幾何複雜度相關的細節級別(LOD)系統(與討論MIP映射時使用的LOD相對照)。假定如今絕大多數PC遊戲支持的處理器速度的巨大範圍,以及你可能渲染的任何給定可視場景的動態性質(在屏幕上有一個角色還是12個?), 你通常需要一些系統來處理這樣的情況,比如,當系統接近極限試圖同時在屏幕上繪製出12個角色,每個角色有3,000個多邊形,並維持現實的幀速率。 LOD 被設計來協助這樣的情景中。最基本的情況,它是在任何給定時間動態地改變你在屏幕上繪製的角色的多邊形數量的能力。面對現實吧,當一個角色走遠,也許只有十個屏幕像素高度,你真的不需要3000個多邊形來渲染這個角色 -- 或許300個就夠了,而且你很難分辨出差別。 
  一些 LOD 系統將會需要你建立模型的多個版本,而且他們將會依靠模型離觀察者的接近程度來改變屏幕上的LOD級別, 以及多少個多邊形正被同時顯示。更加複雜的系統實際上將會動態地減少屏幕上的多邊形數量,在任何給定時間,任何給定的角色,動態地 -- Messiah和Sacrifice包括了這種風格的技術,儘管在CPU方面並不便宜。你必須確信,與首先簡單地渲染整個事物相比,你的 LOD 系統沒有花較多的時間計算出要渲染那些多邊形(或不渲染)。 任一方式都將會工作,由於如今我們試圖要在屏幕上繪製的多邊形數量,這是件非常必要的事情。注意, DX9 將會支持硬件執行的自適應幾何縮放(tessellation)。
  歸結起來是,得到一個運動流暢,其表現和移動在視覺上可信,屏幕上看起來逼真的模型。流暢的動畫時常是通過手工建造動畫和運動捕捉動畫的組合得到。有時你僅僅手工建立了一個給定的動畫 -- 當你在爲一個模型做一些你在現實生活中不能做到的事情的動畫時, 你傾向於這樣做 -- 舉例來說,你確實不能向後彎腰,或像Mortal Kombat 4中的Lui Kang那樣在行進的腳踏車上踢腿,通常運動捕捉這時候就出局了! 通常運動捕捉動畫 -- 實際上視頻捕捉活生生的演員貫穿於你想在屏幕上所看到的動畫 -- 是得到逼真的東西的方式。真實感的東西能使一款普通遊戲看起來很棒,而且能掩飾許多事情。比如 NFL Blitz,屏幕上的模型大約有 200 個多邊形。它們在靜止站立時看起來可怕的斑駁,一旦這些模型跑動起來它們就有快速流暢的動畫,模型自身的許多醜陋消失了。眼睛容易看見的是 '逼真的' 動畫而不是模型自身的結構。 一個不錯的模型設計師能夠掩飾大多數模型缺陷。
我希望這些帶給你對模型和動畫問題的洞察力。在第五部份中,我們將會更加深入3D世界的建造,討論一些物理,運動和效果系統的東西。
第5部分: 物理,運動,效果 

世界建造
  常常在建立一個含有任何3D成分的遊戲時,你最終要試圖建立一個將會在裏面產生遊戲動作的3D環境。 不知怎麼的遊戲開發者提供了一個建立這種環境的方,它容易修改,有效率,有較低的多邊形數量,對於遊戲既容易渲染又容易運用物理學。很簡單,對嗎?當做這個的時候我用左手在做什麼?當做這的時候 , 我對我的左手做什麼? 是的。不錯。 
  雖然那裏有許多3D結構程序,從CAD/CAM程序到3D Studio Max,建造遊戲世界是不同於建造內部或外部世界的模型的尷尬。你有三角形數量問題 -- 任何給定的渲染器一次只能渲染這麼多的多邊形,這對於天才的關卡設計師來說永遠都不夠。不知這些,你也只能每個關卡存儲預定數量的多邊形,所以即使你的渲染器能夠在視野中處理250,000個多邊形,即使你只能在合理數量的空間中存儲500,000個多邊形,那麼取決於你怎麼處理它,最後你的關卡價值像兩個房間那麼小。不好。 
  任何方法,開發者需要提出一個創作工具 -- 最好足夠靈活,允許遊戲引擎需要的各種事物 – 比如,在世界中放置對象,在進入遊戲以前對關卡的適當預覽,以及準確的光照預覽。在他們花三個小時預先處理關卡來產生一個 '引擎可消化的' 格式之前 , 這些能力允許遊戲開發者看到關卡將在遊戲中看起來怎麼樣。 開發者需要關於關卡,多邊形數量,網格數量等等的相應數據。 他們需要一個合宜而友好的方式能夠讓世界有紋理背景圖,容易存取多邊形數量縮減工具,如此等等。這個清單可以繼續列下去。 
  在先前已經存在的工具中找到這個功能是可能的。許多開發者使用Max或者Maya建造他們的關卡, 但即使3D Max需要對它的功能有一些任務特定的擴展來有效率地完成關卡建造工作。甚至可能使用關卡建造工具,像QERadient(見下圖),而且把它的輸出重新處理成你的引擎能夠解釋的格式。

不能看見它? 別煩擾…
  回想一下我們在第一部分討論的BSP (二叉空間分割) 樹,你也可能聽說過潛在可視集合(PVS)這個術語正被四處談論。兩者都有相同的目標,不去探究涉及到的繁雜的數學,它是一種把世界分解爲你能從世界任何給定位置看見的牆壁的最小子集的方式。在實現時,它們僅僅返回你能看見的那些,而不是那些隱藏在可能被遮擋的牆壁後面的。你能想象出這給軟件渲染器帶來的好處,渲染的每個像素(可能是這樣的情形)極爲重要。它們也按從後到前的順序返回那些牆壁,在渲染時這是很方便的,因爲你能夠在渲染次序中確定一個對象的實際位置。 
  大體而言,BSP 樹最近正不受歡迎,由於它們的一些古怪,而且因爲我們從當今3D顯示卡獲得的像素吞吐量,再加上Z緩衝像素測試,BSP 常常成了一個多餘的過程。它們在計算出你在世界的確切位置和正在你周圍的幾何物體方面是便利的,但常常有比BSP樹更好而且更直觀的方式來存儲這些信息。 
  潛在可視集像它聽上去一樣非常好。它是這麼一個方法,在任何給定時間,給定你在世界的位置,它決定世界的哪些表面,哪些對象實際上可以看得見。這時常用來在渲染之前剔除對象,也剔除它們來減少AI和動畫處理。畢竟,如果你實際上不能看見它們,爲什麼還要費腦筋處理呢。多半這真的是不重要的,如果一個非玩家角色(NPC)正在播放動畫,或者甚至在運行它的AI思考。

遊戲物理學
  既然我們已經在內存中得到了世界的結構,我們必須防止我們的角色從裏面掉落出去,並處理地板,斜坡,牆壁,門,以及移動平臺。加之,我們必須正確地處理地心引力,速度變化,慣性,和放置在世界裏面的其它對象的碰撞。這被看作是遊戲物理學。而且在我們進一步深入討論之前,我想現在就在這裏消除一個神話。任何時候你在世界中看見物理,或者任何人在一個複雜的遊戲環境中宣稱“真實的物理”,很好,它是BS。超過80%的建造一個有效率遊戲物理系統的精力花在簡化用來處理世界中對象的真實方程式上面。甚至那時,你時常忽略什麼是‘真實的’,並創造一些‘有趣的’東西,畢竟,這是目標所在。
  經常地遊戲者將會忽視真實世界的牛頓物理學,並扮演他們自己的,更有趣的真實版本。例如,在QuakeII裏面,你能夠立即從0加速到35MPH,並快速停下來。沒有摩擦力,而且斜坡不提供真實斜坡提供的相同類型的重力問題。身體沒有它們應該的作用在所有關節上的地心引力 -- 你看不見身體像真實生活中那樣倒在桌子上面或者邊緣 -- 而且地心引力它本身甚至可能是可變的。 面對現實吧,在真正的世界中,空間中的飛船不像二戰飛行戰鬥員在它們的表面操作那樣實行。在空中,全部是力和反作用力,力在重量點周圍作用,等等。不像 X-Wing中的Luke Skywalker那樣嘯叫。儘管那樣做更加有趣! 
  作爲遊戲開發者來說,無論我們做什麼,我們需要能夠檢測牆壁,檢測地板,在世界中處理和其他對象的碰撞。這些是現代遊戲引擎的必備 – 我們決定對它們進一步要做的取決於我們和我們的遊戲需要。

效果系統
  如今絕大多數的遊戲引擎建造有某種效果產生器,這允許我們表現出有洞察力的遊戲者期盼的所有可愛的吸引眼球的東西。然而,效果系統幕後所進行的東西能夠急劇影響幀速率,所以這是我們需要特別關心的地方。如今我們有很棒的3D顯示卡,我們能夠傳送大量的三角形給它們,而且他們仍然要求更多的三角形。並不總是那樣。 在Heretic II,使用它的可愛的軟件渲染模式,由於他們漂亮的符咒效果,Rxxen遇到了相當嚴重的過度繪製問題。回想當你在屏幕上繪製相同的像素超過一次時,過度繪製就發生了。當你有許多效果正在進行,按其性質你有許多三角形,多個三角形可能相互堆疊在彼此上面。結果是你有許多重複繪製的像素。加上Alpha,這意味着在重新繪製之前你必須讀取舊像素並和新的像素混合,這會消耗更多的CPU時間。 
  Heretic II的一些效果能說明這點,我們在一幀裏對整個屏幕重複繪製了四十遍。很驚訝,是嗎?因此他們在效果系統裏面實現了一個系統採樣在過去30幀的幀速率,如果速度開始減慢,它就自動地縮減任何給定效果繪製的三角形數量。這樣使主要工作完成了,幀速率保持住了,但一些效果看上去很醜陋。 
  無論如何,因爲如今絕大多數效果傾向使用大量很小的粒子模擬火和煙等等,結果你在效果代碼裏面每幀要處理許多的三角形。你必須把它們從一幀移動到下一幀,決定它們是否完成了,甚至還要在它們身上運用一些物理學以便讓它們在地板上面適當的反彈。這在PC上面都是相當昂貴的,因此甚至現在你必須對你所能夠做的有一些實際限制。舉例來說,用一個像素粒子產生火的效果可能會很好,但當你這麼做的時候就別期望在屏幕上做更多別的事情。 
  粒子被定義爲擁有它們自己的世界位置和速度的非常小的可繪製的物體。它們不同於有方向的精靈,大的粒子使用這些精靈 -- 比如噴出的一團團煙霧。它們面向照相機自動而典型地旋轉,縮放,改變它們的透明級別,因此它們能夠隨着時間淡出。我們容易看到大量的粒子,但我們卻限制精靈的數量—儘管兩者之間的真正不同如今正在模糊。將來,特別是在 DX9 和更加高級的圖形硬件表面以後,我們可能看到更多的人們使用過程shader來產生跟粒子系統相似或者更好的效果,創造非常棒的動畫效果。 
  當談論效果系統時,你可能聽說過‘圖原’這個詞。一個圖原是你的效果系統將處理的效果的最低級別的物理表現。更進一步解釋,一個三角形是一個圖原。那是絕大多數引擎最終在底層繪製的 -- 大量的三角形。當你沿着系統向上時,你對圖原的定義隨着變化。比如說,頂層的遊戲程序員不想考慮處理個別的三角形。他僅僅想說,"這個效果在這裏發生" 並讓系統以一種黑盒方式處理它。因此對於他來說,一個效果圖原就是‘讓我們在世界的這點持續這麼長時間用這樣的引力產生一束粒子’。在效果系統內部,它可能認爲一個效果圖原是它那時正在產生的每個單獨的效果,像一組遵循同樣的物理學規則的三角形—然後它傳送所有這些單獨的三角形到渲染器進行渲染,因此在渲染器層次,圖原就是一個單獨的三角形。有一點困惑,但你知道總的思想了。 
以上就是第五部分,下一個部分是關於聲音系統,和各種不同的音頻APIs,3D音頻效果,處理閉塞和障礙,各種不同材料對聲音的影響,音頻混合等等。
第6部分: 聲音系統,音頻APIs 

聲音系統
  由於人們玩的遊戲在種類和技術上的進步,聲音和音樂近幾年來在遊戲中正逐漸變得重要起來(聲音是一個實際遊戲的可玩特點,比如在Thief和其它同類遊戲中的聽覺提示)。現在四聲道環繞系統在遊戲玩家的寶庫中是負擔得起的和平常的事。給定空間的聲音,噪音的障礙和閉塞,和動態的音樂,如今許多遊戲使用這些提高玩家情緒上的反應,更多的關注投入到這個領域就不足爲奇了。
  現在在PC競技場中,遊戲玩家實際上只有一種聲音卡可以選擇 -- PC聲卡製造商創新公司(Creative Labs)的Sound Blaster Live! 從舊的時間個人計算機聲音卡片製造業者有創造力的中心. 多年來創新公司已經爲DirectX提供了他們的EAX聲音擴展,並且他們是發起新的OpenAL(開放音頻庫Open Audio Library)的創立者。就如同OpenGL是一個圖形API一樣,OpenAL,像它起來聽一樣,是一個聲音系統的API。OpenAL 被設計爲支持大多數通常聲卡的許多特徵,而且在一個特定的硬件特徵不可得時提供一個軟件替代。
  爲了更好的定義 OpenAL,我向創新公司的Garin Hiebert詢問了其定義: 
  "這裏借用我們的 " OpenAL 規格和叄考" 的一個定義: 
  OpenAL 是對音頻硬件的一個軟件接口,給程序員提供一個產生高質量多通道輸出的能力。OpenAL 是在模擬的三維環境裏產生聲音的一種重要方法。它想要跨平臺並容易使用,在風格和規範上與OpenGL相似。任何已經熟悉OpenGL的程序員將發現OpenAL非常熟悉。 
  OpenAL API能容易地被擴展適應插件技術.創新公司已經把EAX支持加入到這套API了,程序員可以用來給他們的聲音環境增加複雜的反響,比賽和障礙效果。
  如同Jedi Knight II: Outcast 一樣,連同Eagle 世界/聲音特徵編輯器,Soldier of Fortune II 以這個新系統爲特徵。什麼是Eagle? 在介紹這個以前,讓我們討論一些其他的系統,並定義一些聲音術語。 

  另外的一個系統是Miles聲音系統。Miles是一家公司,它爲你的代碼生產插件,在充分利用每塊聲卡時處理所有必須的到特定聲音卡的說話(比如Sound Blaster Live!系列,或者老的A3D聲卡)。它非常像一個API前端,捆綁了一些額外的特徵在裏面。 在其他事物當中Miles讓你存取一些事物像MP3解壓縮。 它是很好的解決方案,但像任何事一樣,它花費金錢並是你的代碼和硬件之間的額外一層。雖然對於快速的聲音系統制造,它非常有用,而且他們有段時間了,因此他們的確精通自己的業務。

聲音術語
  讓我們開始障礙和閉塞。它們聽起來一樣,但不是這樣。閉塞基本上意謂着一個聲音在播放時聽者在他們之間有一些閉合的障礙物。 
  比如說,在NOLF2的一個屏幕鏡頭上你聽到房子裏面壞蛋的聲音。你能聽到他們,但是他們的聲音相當低沉而沙啞。障礙是相似的,但是你和聲音之間的障礙物並不是閉合的。一個好的例子就是在你和聲源之間有一根柱子。由於房間中的回聲你仍然聽得到這個聲音,但是它和聲音直接傳遞到你的耳朵裏是不同的。當然這確實依賴於知道在你的耳朵和聲源之間的直線上是什麼。而且根據房間的大小,聲源到你的距離等等,需要的處理能變得相當耗時。後面我們將會談到跟蹤--足可以說它時常是比較慢的幀速率的原因。Quake III 裏面的A3D 代碼做了這些事情,關閉這些選項通常能夠提高幀速率。Tribe 2 是這種弊病的另外一個受害者。關閉3D聲音選項則你的幀速率立即好轉,這在你考慮Tribes世界有多大和你能看見多遠時有意義。 
  接着是聲音物質的特徵。大部分聲卡可以讓你能夠用可定義的過濾器作用於聲音從而修正播放的聲音。例如,在水下,或者在一個布料遮蓋的房間中,或者在一個長的走廊中,或者在歌劇院,聽到的聲音有着很大的不同。能夠根據你所處的環境改變你聽到聲音的方式是相當不錯的。 
  我們回到Eagle… 這是一個編輯器,允許多數第一人稱射擊遊戲地圖設計者將他們的地圖導入到這個工具,然後構造簡化的幾何形體來爲實際遊戲引擎中的EAX代碼產生一個聲音地圖。其思想是你不需要一個真實的圖形地圖的複雜幾何形體來模擬聲音環境。你也能夠給產生的簡化地圖分配聲音物質,這樣聲音環境就能夠動態地改變。我親眼目睹了這在Soldier of Fortune和Unreal Tournament上的示範,確實相當引人注目。 我這在財富和 Unreal 巡迴賽和它的軍人上真的對示範是證人相當醒目. 當你跳入水中時,聽到所有的聲音改變,這是一個非常令人沉浸的經歷。 
  好,讓我們繼續吧。

建立你自己的遊戲引擎?
  你可能建立自己的引擎而不是購買許可證。這避免了誰擁有什麼,版稅等所有的法律糾紛,而且如果你產出了質量足夠好的東西,你甚至能夠向別人出售許可證。然而,正如已經指出的那樣,這需要時間和金錢來完成,更不用說絕對優秀的程序員了。LithTech 已經發展了很多年,與Unreal類似。很有趣,主要是因爲變化的硬件和API版本,實際上Unreal最初的版本花費了四年時間才完成。當他們剛開始的時候,軟件渲染是唯一的遊戲。當開發正在繼續的時候,3dfx帶來了Glide,然後是Nvidia的TNT顯卡(從那時起硬件和APIs確實有了更多的進步)。這就是它爲何支持這麼多不同的渲染途徑的原因。當然在一個相同的引擎內支持所有這些是一場編碼惡夢,但那是另外的事。每個引擎有模塊化的方式, 並且當一個模塊---比如說,腳本---變得過時了或者需求變化了,你只需要把它抽出來並開始做一個新的模塊。
  Quake引擎經歷時間有更加完整的進化發展。相應於Id公司下一個遊戲的一組需求,當John Carmack創造了在當時的硬件上運行最快的東西時,引擎的每個版本都經過了完全的重寫。QuakeII完全重寫了不少於四次,我個人看到了QuakeIII的機器人代碼的三個不同的版本。其他的開發者也沒有能夠避免這種情形。John Scott,建造了Soldier of Fortune II的地表系統,曾對我提到,在動態地表生成上他曾嘗試了許多方法讓物理學正確地工作。 
  建造技術或者完整的引擎不是件容易的事情。當今的遊戲引擎需要許多,許多的系統,就如同許多人們嘗試創造‘下一個大的引擎’時所發現的那樣,從屏幕上文本的簡單顯示到高級人工智能。並且如我前面提到的,不斷髮展的新技術使得建造一個快速,高效的引擎是一個變化的目標。事實上,我見到有人僅僅爲了讓一個帶alpha的紋理正確地顯示而在PS2的混合模式上花了四天時間。
  值得考慮的其他引擎有Garage Games的Tribes 2引擎---被稱爲The Torque Game Engine。我的理解是它可以收取微小數量的許可費用,將來有一些版稅協議。這是的確值得考慮的事情。你可以在這裏看到這個引擎的特徵細節http://www.garagegames.com/index.php...&page=features 。 然後就是Serious Sam 引擎。這也是需要許可證的,的確值得看一看。如果你對它有興趣的話,可以聯繫God Games---他們應當可以給你指明正確的方向。 
  在網絡上有一些你可以下載的自由引擎---首先想到的是******* Space引擎。你可以從這裏下載http://sourceforge.net/projects/******* ;,並在你的遊戲中隨意使用。這不是一個專業的引擎,但看看所有的部分如何結合在一起時常是一個好的學習經歷。
  還有就是最初的Quake Engine,現在已經被Id公司開放源代碼。對於任何有抱負的遊戲程序員來說這是一個很好的開端----下載它,編譯,開始調整。值得記住的是,這個擎是許多年以前的了,與Quake III或者新的Doom沒有多少相似性。重複一遍,它確實是個好的開始。你能從這裏找到發現好的資源網頁http://www.inside3d.com/qip/home.shtml ;。
  確實,這一切都是時間與金錢的事情。如果你沒有時間開發一個新的引擎,就不要介意花錢使用第三方的引擎,去購買一個吧。注意,對於要求使用他們引擎的團隊,如今大多數引擎許可團體有很合理的途徑。儘可能地讓許多人們使用他們的技術,因此這種經驗變成了工業標準,這對他們有好處。

‘Mod’社區
  看一眼任何在線遊戲服務器的統計數字,顯示出Counter Strike服務器比任何其他遊戲服務器都要多。和它最近的競爭者(Quake III或者Unreal Tournament)相比,幾乎有兩倍的CS服務器。 
  遊戲 mods 全部來自於一些編輯程序,這些程序讓遊戲者能夠修改DOOM最初的.WAD文件,提供他們自己自家制造的關卡設計和紋理。人們開始玩這些(大致)自家建造的工具,並且也發現了他們可以產生其他人想玩的關卡。Id注意了這個趨勢,而且將Quake系列引擎帶到了一個新的階段,這樣設計遊戲,使得遊戲是用戶可修改的。他們甚至發佈他們自己的設計工具,指令,而且甚至---喘口氣---遊戲中的代碼,如此有抱負的遊戲程序員可以在Quake Universe中玩。你可能從這個創造出自己版本的Quake連線經歷。許多今天的業內大師來自這種早期的修改經驗。現在有名的設計者如LevelLord和CliffyB在這個行業中就是這樣開始的。最高的榮譽來自一位名叫ZOID的紳士,他提出了3Wxxe CTF,第一個‘奪取旗幟’的遊戲,遊戲中需要人們組隊---連線遊戲從純粹的死亡競賽以來的第一次進化發展。 
  一些遊戲是如此的流行以致於他們每年都有事件發生。比如說,Quake有一個QuakeCon,在Mesquite Texas,Id軟件公司所在地,舉行的一年一次的quake大會。人們帶着他們的PC來到這裏,或爲了看最新的mods或是展示的基於Quake引擎的遊戲。
  如今你製作的任何遊戲需要或者有殺人者可多人玩的經驗,或者有可以非常容易修改的內容這樣連線‘修改者’能利用你的遊戲並製作出其他遊戲來。這一切延長了你遊戲的生命,有希望賣出更多,人們購買它,可以下載mods來玩最新的Quake III修改版本:The Teachers Strike Back。但你不能僅僅生產一款遊戲,發佈你的工具,就袖手旁觀。實際上你最初必須把代碼設計成不需要程序員就可以容易地擴充, …好吧, … John Carmack。
  作爲一個開發者,你需要在那裏可以見得到,併爲那些在家中想利用你的遊戲和用它做點別的什麼的人們提供經驗和幫助。這種支持可以有許多形式----一個親切友好的詞語,一段代碼,建議,宣傳或只是金錢。只要有這個它時常不介意採用何種形式。 
  在這裏你選擇哪個第三方工具用來建造內容可能是至關重要的。在Rxxen,過去我們已經做了一些開發決定,在這方面沒有什麼幫助,由於我們爲大多數的建模和所有的動畫需求使用了SoftImage。雖然它是製作我們需要的動畫的最好工具,對於家庭業餘愛好者來說它太過昂貴了。這就給那些家庭業餘愛好者在擴充我們製作的內容時帶來了問題,因此他們容易拋棄我們轉而尋求那些比較容易製作內容的遊戲。在建造或者選擇一個引擎時這確實是值得留意的事情。爲了響應制作遊戲mods,Discreet在市場上發佈了一個3D Studio Max的‘lite’版本,稱爲gmax。最好的是,它是免費的。如果你想要試一試,你能從這裏抓取它http://www.discreet.com/products/gma...mer/index.html ;。
  最後在線遊戲的成功時常能追蹤到 mod 社區,因此我認爲感謝他們做了件好的工作是公平的。我過去時常說,在行業中到達一個‘真正的’工作最快的方式是從一個mod開始,說明你有完成它的訓練並用它作爲一個面試獲得者。不能說,"我能做這個" 就像已經完成了一樣。因此去到那裏並開始吧。你損失什麼了嗎?

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