3d游戲圖形引擎的設計與實現(xiàn)_第1頁
3d游戲圖形引擎的設計與實現(xiàn)_第2頁
3d游戲圖形引擎的設計與實現(xiàn)_第3頁
3d游戲圖形引擎的設計與實現(xiàn)_第4頁
3d游戲圖形引擎的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

3d游戲圖形引擎的設計與實現(xiàn)

隨著扎克盜賊的性能和速度的提高,網(wǎng)絡游戲在中國的開發(fā)日益激烈。3D游戲因其逼真、虛幻的場景畫面和人物造型,以及燈光照明效果和爆炸煙火等特效,已取代了2D游戲的地位,成為市場上的主流。從內(nèi)部技術的角度講,這主要歸功于3D圖形渲染器(嵌在客戶端)。即如果一款網(wǎng)絡游戲沒有一個高效的3D圖形渲染器,那么它很難吸引玩家的目光。渲染器是3D游戲引擎中最重要的部分之一?,F(xiàn)在業(yè)界和學術界對于渲染器的架構沒有形成統(tǒng)一的標準,在大量閱讀文獻和編程的基礎上,本文提出了一個渲染器的構架。首先介紹渲染器的構架和實現(xiàn)其中每個子模塊的算法,之后重點講解場景管理、光照模型和紋理系統(tǒng)兩個重要的子系統(tǒng),最后介紹了渲染房間和地形這兩種特殊場景的高效算法。13瞳石機底層次設計按照不同的功能和任務,如圖1所示,可以把渲染器整個底層次細分為三維模型、場景管理和特效三個子系統(tǒng)。一般由Direct3D或者OpenGL來實現(xiàn)它們。1.1光照和表面性質(zhì)子模塊三維模型子系統(tǒng)負責游戲場景中三維物體的創(chuàng)建和渲染,它包含如圖2所示的三維建模、光照和表面性質(zhì)、鏡頭控制、房間和地形渲染四個子模塊。三維建模子模塊是制作3D游戲模型的基礎,3D游戲場景中的模型往往是3DMAX或是MAYA做出來的3D模型,模型中存儲了頂點的位置、面的組成、頂點的紋理坐標、材質(zhì)和貼圖等需要的信息。光照和表面性質(zhì)子模塊主要負責物體真實感的繪制。3D游戲中,必須在三維空間設置光源,照射到三維物體上,才能使得物體表面有明暗的效果。表面性質(zhì)也是物體一類重要的參數(shù),比如顏色、反光度、凹凸性等,在游戲引擎中,一般采用材質(zhì)貼圖來模擬物體的表面性質(zhì)。鏡頭控制子模塊定義了游戲世界中視點的位置和方向等參數(shù)。在3D射擊和飛行模擬游戲中,鏡頭要隨著玩家的操縱而不斷地變化。如何簡單有效地定義并控制鏡頭,對三維游戲的總體效果起到很大的作用。除了鏡頭的拉近拉遠之外,最重要的效果就是鏡頭的旋轉。在3D游戲中,一般采用Euler角或四元數(shù)法控制鏡頭的旋轉。房間和地形渲染子模塊是為了加快房間和地形兩種特殊場景的繪制而獨立出來的渲染子模塊。對于房間和地形采取與其他場景物體不同的渲染方法會大大提高游戲畫面繪制的速度和效果。1.2塊、拉拔面的空間劃分與排序模塊3D引擎最核心的部分是場景管理。場景管理負責空間的劃分和排序、可見性判斷和裁剪、碰撞檢測與反饋,與這三個功能相對應,場景管理子系統(tǒng)可劃分為三個模塊,即空間劃分與排序模塊、可見性判斷與裁剪模塊、碰撞檢測與反饋模塊(圖3)??臻g劃分與排序模塊的目的是為可見性判斷和碰撞檢測模塊提供支持。這個模塊最終會構建出場景樹,使可視性問題和碰撞檢測問題都最終歸結為場景樹的遍歷與下溯??梢娦耘袛嗯c裁剪模塊利用場景樹判斷物體是否在視野中可見,剔除被遮擋或者視野外的物體,再對局部物體采用Z-緩存算法進行排序和隱藏面消除工作。碰撞檢測與反饋模塊負責3D游戲中各物體之間的碰撞檢測以及物體與場景之間的碰撞檢測。碰撞檢測的過程是重要的。如果沒有它,游戲中的人物就會毫無遮攔地移動——如果考慮重力的話,則會一直不停地往下掉,直到符點數(shù)溢出(或受不了這一漫長的過程而離開游戲)為止。1.3游戲中的自然體驗特效子系統(tǒng)(圖4)包括粒子系統(tǒng)、公告牌、霧效等模塊,負責在游戲世界中實時模擬各類自然現(xiàn)象,通過特效子系統(tǒng)處理的場景將會變得十分逼真和生動。粒子系統(tǒng)模塊模擬大量的自然現(xiàn)象,如火焰、噴泉、爆炸、魚群、氣體、星空等,它們的原理相似。一個粒子系統(tǒng)由帶有不同屬性的物體對象與其必須遵守的行為規(guī)則組成,確切地說這些屬性和規(guī)則依賴于想模擬的現(xiàn)象。一些粒子系統(tǒng)可能需要大量的屬性和復雜的規(guī)則,然而有些可能極為簡單。公告牌,在3D游戲中有著廣泛的應用。它的本質(zhì)就是用預先做好的幾幅位圖來代替3D物體,極大地節(jié)省了資源和提高了速度。仔細觀察“魔法門”系列游戲,它的精靈,樹木,物品都是二維圖像,但由于它始終朝向觀察者,你根本看不到它“扁”的一面,所以給人一種立體的感覺。霧是一種自然現(xiàn)象,在大部分地方并不算常見,但是在現(xiàn)在的3D游戲中,卻是必不可少的一個元素。使用霧除了增加天氣系統(tǒng)的效果外,主要原因是受限于硬件的能力,3D游戲并不能把游戲中的整個場景渲染出來,只能繪制到一定的距離。在這個距離之外,即裁剪空間的后平面之后是一片空白。為了彌補這個空白,很多游戲就使用霧的效果來掩蓋。2渲染內(nèi)核的主要模塊和技術上節(jié)中我們分析3D游戲引擎渲染內(nèi)核的構架,對其中的子系統(tǒng)進行了介紹。下面,我們將詳細剖析其中的幾個模塊和實現(xiàn)它們的常用技術。2.1多重紋理映射光影貼圖技術是游戲引擎中最流行的光照處理方法,尤其在第一人稱射擊游戲中。光影貼圖是一種簡單而非常有效的光照處理方式。簡單來說,在每個多邊形上貼兩個紋理,第一個是常規(guī)的紋理,第二個是光照圖,第二紋理用來表達光強度的分布。圖5顯示了紋理與光影貼圖的結合,使其多邊形看起來具有陰影效果。在程序?qū)崿F(xiàn)上,可以采用多重紋理或多通道渲染來實現(xiàn)光影貼圖。多重紋理通過采用兩個紋理進行乘法紋理混合一次渲染多邊形;而多通道渲染通過兩次渲染多邊形,每次貼上一個紋理可以達到與多重紋理相近的效果。在游戲引擎的設計中,通常采用多重紋理映射。因為它較之多通道渲染有兩個好處:①速度快,多邊形無須進行兩次光柵化,而且現(xiàn)今大多的3D加速卡都可對多重紋理渲染進行硬件優(yōu)化,一些加速卡甚至可在單通道里應用四個紋理甚至更多。②效果更好。圖6(a)是不支持多重紋理映射的顯卡渲染出來的Quake場景,而圖6(b)是支持多重紋理映射的顯卡繪制出來的場景。值得注意的是,光影貼圖技術多重紋理映射本質(zhì)上是在渲染之前預先生成的一種罐裝效果。在游戲的場景中燈光或物體都是運動的,必須在每一幀渲染之前生成相應的光照貼圖(光照紋理),按照動態(tài)燈光或物體運動的方式修改光照紋理。雖然光影貼圖可以快速地渲染,但是存儲這些燈光紋理所需的內(nèi)存消耗非常昂貴。而且如果場景中有多個燈光,對所有的物體重新生成光照紋理將極為耗費CPU時間。許多游戲使用混合照明方式。以QuakeIII為例,場景使用光影貼圖,動畫模型使用頂點照明。預先處理的燈光不會對動畫模型產(chǎn)生正確的效果——整個多邊形模型得到燈光的全部光照值,而動態(tài)照明將被用來產(chǎn)生正確的效果。2.2圖像旋轉的控制鏡頭的位置和方向定義在世界坐標系里面。在投影時,先要用一個矩陣把三維模型從本地空間轉換到世界空間,這個矩陣叫本地空間到世界空間轉換矩陣。然后再根據(jù)鏡頭的位置和方向,形成另外一個矩陣,稱為投影矩陣。因此,鏡頭的旋轉,體現(xiàn)在投影矩陣上,而物體在三維空間的內(nèi)旋轉體現(xiàn)在本地空間到世界空間轉換矩陣上。矩陣運算很難直接表達與空間鏡頭的變換。如果要算出中間位置,需要插值計算,但對矩陣進行插值是非常困難的。在3D游戲中,一般采用Euler角或四元數(shù)法控制鏡頭的旋轉。Euler角表達旋轉比矩陣直觀,但是Euler角在插值方面的效果不是很好,會出現(xiàn)很生硬的效果,更為嚴重的是,它會導致萬向節(jié)鎖定。而四元數(shù)法被大量地使用在第三視角的游戲中,通過四元數(shù)法可以避免矩陣相乘,易于插值,并且插值的效果好,形成的動畫效果非常平滑柔和?!稑O品飛車》系列中的鏡頭控制便采用了四元數(shù)法,如圖7所示。2.3房間和地形2.3.1小區(qū)、入口和物品對象入口技術對于解決游戲中室內(nèi)場景的生成問題提供了一個較好的解決途徑,主要優(yōu)點是快速并且易于實現(xiàn)。所謂入口,實際上就是引擎中連接小區(qū)的一類特殊多邊形。通常它不需要紋理映射(除非它是半透明的),而是將小區(qū)中其他部分映射到該入口上。小區(qū)則用來描述游戲世界中房間的概念。從理論上來說,利用入口和小區(qū)可以描述游戲虛擬世界中任意不包含絕對曲面的三維世界。然而入口技術要求三維對象的剖分多邊形是凸的,這樣入口才可以正確進行。同時,由于入口本身是用于解決多邊形排序并進一步進行隱藏面消除問題的,因而對于相互重疊的多邊形渲染它將無能為力。小區(qū)、入口和物體對象是引擎中構造游戲世界空間的基本對象,引擎中分別定義了Sector、Portal和Thing類來對應于以上三個概念。下面將分別加以說明:(1)sector(2)接受額定義(3)幕尺寸大小的二維矩形定義好空間后,在渲染之前,需要對視圖進行裁剪。初始視圖是一個屏幕尺寸大小的二維矩形。每次進入一個入口遞歸產(chǎn)生新的視圖時,需要將經(jīng)過透視矯正處理后的入口和初始視圖進行求交,它們的交將構成新的視圖?,F(xiàn)在PDA上的3D游戲也大量采用了入口技術,如圖8所示。2.3.2lod技術的應用目前的地形渲染技術主要有Voxel和LOD兩種。體素(Voxel)也就是VolumetricPixel。它是相對于像素來說的,如果像素是一個二維矩形,那么Voxel就是一個三維的立方體。三角洲部隊游戲就是使用了Voxel技術。關于Voxel的細節(jié)技術不是本文的重點,不進行深入的介紹。Voxel有一個天生的優(yōu)點就是渲染的時候它和場景的大小沒有關系,而且絕對不會渲染多余的東西(自帶裁剪功能)。它的復雜度只與我們需要的視野以及分辨率有關,而且可以在不使用硬件加速的情況下達到比較理想的速度(三角洲部隊I就沒有使用硬件加速),生成的圖像也比較細膩。它的缺點就是不夠靈活。LOD(LevelofDetail)即層次細節(jié),它不同于體素技術,它是一種使用多邊形的,真正的3D渲染技術。其根據(jù)一定的規(guī)則來簡化物體的細節(jié),可以根據(jù)需要來選擇不同細節(jié)程度的物體表達方式。如離觀察者近的選擇較高的細節(jié)程度、反之選擇較低的細節(jié)程度。用在地形渲染中,有時我們也稱它為多分辨率地形(MultiresolutionTerrain)渲染技術。地形作為一種特殊的幾何物體,在運用LOD法則的時候有一些特殊的技巧。因為地形通常是一個規(guī)則的矩形網(wǎng)格,其簡化模式可以有規(guī)則的簡化和非規(guī)則的簡化。規(guī)則的簡化通常是對這個矩形網(wǎng)格采用自頂向下(Up-to-Down)、分而治之的策略,典型的有四叉樹和二叉樹,它們從場景的最低細節(jié)層度開始,按需要不斷地提高細節(jié);非規(guī)則的簡化通常是采用自底向上(Down-to-Up)的方法來處理,它的實現(xiàn)通常較少?,F(xiàn)在的3D多采用基于ROAM實時動態(tài)LOD地形渲染,如圖9所示。2.4游戲中的場景樹對于由多個物體組成的3D場景,最簡單的組織方法是把其中的物體用一個鏈表連接起來,然后在繪制每一幀的時候依次送入渲染器進行處理。顯然用鏈表管理不是一個很有效的方法,因為其處理一個普通的游戲場景都會顯得非常慢。因此可以采用基于空間排序的方法把游戲引擎中的渲染內(nèi)核設計成樹狀結構(圖10)。在游戲中,場景管理樹被動態(tài)構造。在圖10中的場景管理樹中,沒有加入攝像機(視點)。值得注意的是,每一棵場景樹的根節(jié)點都會掛載一個攝像機。在有些情況下,把攝像機加入到場景管理樹中會簡化游戲的編程,如導彈飛行的場景中,視點應隨著導彈的軌跡而運動。場景樹是一個復合的數(shù)據(jù)結構,包括聲音處理、包圍體、坐標變換、屬性和顯示的表面。在一次場景樹的遍歷中,聲音和圖形渲染同時被處理。而幾何變換和碰撞檢測等功能,通過局部遍歷實現(xiàn)。二叉空間分割樹(BSP)是最基本的空間排序方法,DOOM是第一個使用了二叉樹的商業(yè)游戲。它基于這樣一個事實,即空間中的任何平面都將整個空間分割成兩個半空間,所有位于該平面某一側的點定義了一個半空間,位于另一側的點定義了另一個半空間,如圖11所示。在游戲中,可視性問題和碰撞檢測問題都最終歸結為樹的遍歷和下溯。而這些操作都是O(N)或O(logN)的,效率比較高,這對于游戲的實時畫面處理非常重要。2.5基于場景的bsp和z-存儲算法如果使用BSP樹進行三維空間的排序和裁剪,再對局部物體采用Z-緩存算法進行排序和隱藏面消除工作,就會大大優(yōu)化顯示的速度。具體操作如下:首先根據(jù)場景生成BSP樹,只需要細化到物體級,不一定是細化到多邊形級。這樣BSP的樹葉就是物體或物體的一部分。然后根據(jù)鏡頭的位置,迅速決定哪些物體是在可視空間之外,將它們忽略不處理。然后對剩下的物體的多邊形使用Z-緩存算法。這種方法是目前游戲中最常用的管理場景和渲染場景的方法。圖12所示的《反恐精英》游戲中,場景的處理采用了BSP樹對場景排序和裁剪。2.6兩個bsp樹的合并碰撞檢測是與空間劃分息息相關的,有了高效的空間排序,才有高效的碰撞檢測。在設計3D游戲引擎時,兩者要統(tǒng)籌考慮。游戲引擎中,如圖13所示的《鐵拳5》中,常采用空間剖分法。這個算法主要是使用BSP來進行碰撞檢測,不需要額外的包容體(在層次包圍體樹算法中需要使用包圍體)。對兩個三維物體來說,如果各有其單獨的BSP樹(即所謂的本地BSP樹,或物體BSP樹),則碰撞檢測就變成了兩個BSP樹的合并,其操作如圖14所示。物體1和2,各由三個表面組成,這三個表面就是三個BSP分割平面,形成的本地BSP樹如第二行所示。特別值得注意的是本地BSP樹中包含了物體內(nèi)部外部的空間信息。以物體1的BSP樹為例,從樹的根部A分割平面起,左邊子樹代表A分割平面的內(nèi)向方面,即物體1的內(nèi)部。而右邊子樹代表A分割平面的外部。當考慮兩個物體之間的相對關系時,以物體1的BSP樹為基礎,考查物體2的三個表面,看他們是否有部分插入了物體1的內(nèi)部。如果是,則碰撞。首先看分割平面A,物體2在A向內(nèi)的方向,所以要分割到A左邊的子樹。然后考查分割平面B,發(fā)現(xiàn)D和F被B分割平面分割。其中D1,E1,E2,F1位于B分割平面向外的部分。而D2,D3,F2位于其向內(nèi)的部分。最后考查C分割平面,也就是到了物體1的BSP樹的樹葉。D2位于C分割平面的向內(nèi)部分。這樣,得出了D2位于物體1內(nèi)部的結論,也就是說物體2和物體1發(fā)生了碰撞。這種方法的優(yōu)越性在于BSP樹既比較精確,實時性能又很好。作為一種空間劃分和場景管理的方法,如果已經(jīng)在隱藏面消除中使用(能夠在隱藏面消除中使用本身就說明了其較好的實時性能),再用到碰撞檢測中可以節(jié)省資源。2.7粒子系統(tǒng)每個粒子需要一些屬性來和其他粒子區(qū)別。通常在一個系統(tǒng)中的所有粒子有一個相同的屬性集。下面是適用于粒子的典型屬性:(1)哪里,物體(2)速度包括速度和方向(3)加速度與速度一樣,加速度影響速度(4)生命周期通常由計算機計算限制,因此顆粒被指定為有限的生命周期即時戰(zhàn)術模擬《中途島海戰(zhàn)》游戲中的水波、云特效均采用了粒子系統(tǒng)(圖15)。2.8霧化表和紋理霧在游戲中,使用較多的方法之一是頂點霧效法。把3D物體進行投影變換之后,用每個物體頂點的Z值代表霧的濃度,用類似上面公式的式子計算并修改該頂點的顏色。這樣就得到了一個充滿霧的場景。但如果3D模型的頂點不是很多,就會出現(xiàn)不精確的情況。另外一種方法是霧化表。所謂霧化表,就是建立一張濃度和距離對應的關系表。在繪制場景時,對每一個像素,用其Z值在霧化表中查找對應的濃度,再進行霧的計算。這種方法的優(yōu)點在于:①速度很快,因為在使用Z-緩存時,每一個點的Z值已經(jīng)算出,查表的速度也是很快的;②對每一個像素進行計算,所以無論模型的頂點多少都不會影響繪制效果。但是并不是所有的硬件都支持霧化表,因此這種方法的使用受到了限制。無論硬件是否支持霧化表,它總會支持紋理映射的。我們可以用紋理來模擬霧化表的效果,這就是紋理霧。用紋理來模擬霧化表有很多好處:①幾乎所有的硬件都支持透視校正紋理(在透視空間中正確作插值,需要雙線性插值,如果不支持,紋理將會有明顯的錯誤),但是很少有硬件支持透視校正顏色,所以頂點霧效的效果常常不正確。②材質(zhì)坐標產(chǎn)生可以有很多種變形,不用Z值作為霧的濃度,可以制作許多有趣的霧效果。圖16是PS2上的《GT賽車4》中的兩個霧效截圖。3不同場景的應當使用營造一種新的即速度/效果,這也是開發(fā)新的方式方法在設計游戲引擎渲染器時,應先確定要實現(xiàn)的模塊有哪些,否則中途增加新特性是非常困難的。即使最后能得以實現(xiàn),對效率也會

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論