游戲編程簡(jiǎn)章與游戲引擎_第1頁(yè)
游戲編程簡(jiǎn)章與游戲引擎_第2頁(yè)
游戲編程簡(jiǎn)章與游戲引擎_第3頁(yè)
游戲編程簡(jiǎn)章與游戲引擎_第4頁(yè)
游戲編程簡(jiǎn)章與游戲引擎_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

經(jīng)典word整理文檔,僅參考,雙擊此處可刪除頁(yè)眉頁(yè)腳。本資料屬于網(wǎng)絡(luò)整理,如有侵權(quán),請(qǐng)聯(lián)系刪除,謝謝!)第1部分:游戲引擎介紹,渲染和構(gòu)造3D世界介紹自Doom游戲時(shí)代以來(lái)我們已經(jīng)走了很遠(yuǎn)。DOOM不只是一款偉大的游戲,它同時(shí)也開(kāi)創(chuàng)了一種新的游戲編程模式:游戲"引擎"。這種模塊化,可伸縮和擴(kuò)展的設(shè)計(jì)觀念可以讓游戲玩家和程序設(shè)計(jì)者深入到游戲核心,用新的模型,場(chǎng)景和聲音創(chuàng)造新的游戲,或向已有的游戲素材中添加新的東西。大量的新游戲根據(jù)已經(jīng)存在的游戲引擎開(kāi)發(fā)出來(lái),而大多數(shù)都以ID公司的Quake引擎為基礎(chǔ),這些游戲包括CounterStrike,TeamFortress,TacOps,StrikeForce,以及QuakeSoccer。TacOps和StrikeForce都使用了UnrealTournament引擎。事實(shí)上,"游戲引擎"已經(jīng)成為游戲玩家之間交流的標(biāo)準(zhǔn)用語(yǔ),但是究竟引擎止于何處,而游戲又從哪里開(kāi)始呢?像素的渲染,聲音的播放,怪物的思考以及游戲事件的觸發(fā),游戲中所有這一切的幕后又是什么呢?如果你曾經(jīng)思考過(guò)這些問(wèn)題,而且想要知道更多驅(qū)動(dòng)游戲進(jìn)行的東西,那么這篇文章正好可以告訴你這些。本文分多個(gè)部分深入剖析了游戲引擎的內(nèi)核,特別是Quake引擎,因?yàn)槲易罱ぷ鞯墓綬avenSoftware已經(jīng)在Quake引擎的基礎(chǔ)上開(kāi)發(fā)出了多款游戲,其中包括著名的SoldierofFortune。開(kāi)始讓我們首先來(lái)看看一個(gè)游戲引擎和游戲本身之間的主要區(qū)別。許多人們會(huì)混淆游戲引擎和整個(gè)游戲。這有點(diǎn)像把一個(gè)汽車發(fā)動(dòng)機(jī)和整個(gè)汽車混淆起來(lái)一樣。你能夠從汽車?yán)锩嫒〕霭l(fā)動(dòng)機(jī),建造另外一個(gè)外殼,再使用發(fā)動(dòng)機(jī)一次。游戲也像那。游戲引擎被定義為所有的非游戲特有的技術(shù)。游戲部份是被稱為'資產(chǎn)'的所有內(nèi)容(人工智能和物理學(xué))和為了使游戲運(yùn)行或者控制如何運(yùn)行而特別需要的程序代碼,比如說(shuō)AI--人工智能。對(duì)于曾經(jīng)看過(guò)Quake游戲結(jié)構(gòu)的人來(lái)說(shuō),游戲引擎就是Quakeexe是QAGame。dll和CGame。dll。如果你不知道這是什么意思,也沒(méi)有什么關(guān)系;在有人向我解釋它以前,我也不知道是什么意思。但是你將會(huì)完全明白它的意思。這篇游戲引擎指導(dǎo)分為十一個(gè)部份。是的,從數(shù)量上來(lái)說(shuō),總共是十一個(gè)部份!每個(gè)部分大概3000字左右?,F(xiàn)在就從第一部分開(kāi)始我們的探索吧,深入我們所玩游戲的內(nèi)核,在這里我們將了解一些基本的東西,渲染器讓我們從渲染器來(lái)開(kāi)始游戲引擎設(shè)計(jì)的探討吧,我們將從游戲開(kāi)發(fā)者(本文的背景)也讓您像我們一樣思考問(wèn)題!什么是渲染器,為什么它又這么重要呢?好吧,如果沒(méi)有它,你將什么也看不到。它讓游戲場(chǎng)景可視化,讓玩家/觀眾可以看見(jiàn)場(chǎng)景,從而讓玩家能夠根據(jù)屏幕上所看到的東西作出適當(dāng)?shù)臎Q斷。盡管我們下面的探討可能讓新手感到有些恐懼,先別去理會(huì)它。渲染器做些什么?為什么它是必須的?我們將會(huì)解釋這些重要問(wèn)題。當(dāng)構(gòu)造一個(gè)游戲引擎的時(shí)候,你通常想做的第一件事情就是建造渲染器。因?yàn)槿绻床灰?jiàn)任何東西–那么你又如何知道你的程序代碼在工作呢?超過(guò)50%的CPU處理時(shí)間1/30花費(fèi)在渲染器上面;通常也是在這個(gè)部分,游戲開(kāi)發(fā)者將會(huì)受到最苛刻的評(píng)判。如果我們?cè)谶@個(gè)部分表現(xiàn)很差,事情將會(huì)變得非常糟糕,我們的程序技術(shù),我們的游戲和我們的公司將在10天之內(nèi)變成業(yè)界的笑話。它也是我們最依賴于外部廠商和力量的地方,在這里他們將處理最大限度的潛在操作目標(biāo)。如此說(shuō)來(lái),建造一個(gè)渲染器確實(shí)不象聽(tīng)起來(lái)那么吸游戲或許永遠(yuǎn)不會(huì)躋身于排行榜前10名。如今,在屏幕上生成像素,涉及到3D加速卡,API,三維空間數(shù)學(xué),對(duì)3D硬件如何工作的理解等等。對(duì)於主機(jī)(游戲機(jī))游戲來(lái)說(shuō),也需要相同類型的知識(shí),但是至少對(duì)于主機(jī),你不必去嘗試擊中一個(gè)移動(dòng)中的目標(biāo)。因?yàn)橐慌_(tái)主機(jī)的硬件配置是固定的"時(shí)間快照",和PC(個(gè)人計(jì)算機(jī))不同,在一臺(tái)主機(jī)的生命期中,它的硬件配置不會(huì)改變。在一般意義上,渲染器的工作就是要?jiǎng)?chuàng)造出游戲的視覺(jué)閃光點(diǎn),實(shí)際上達(dá)到這個(gè)目標(biāo)需要大量的技巧。3D圖形本質(zhì)上是用最少的努力創(chuàng)造出最大效果的一門藝術(shù),因?yàn)轭~外的3D處理在處理器時(shí)間和和內(nèi)存帶寬方面都是極為昂貴的。它也是一種預(yù)算,要弄清楚你想在什么地方花費(fèi)處理器時(shí)間,而你寧愿在什么地方節(jié)省一些從而達(dá)到最好的整體效果。接下來(lái)我們將會(huì)介紹一些這方面的工具,以及怎樣更好的用它們讓游戲引擎工作。建造3D世界最近,當(dāng)我和一位從事計(jì)算機(jī)圖形方面工作長(zhǎng)達(dá)數(shù)年之久的人會(huì)談時(shí),她向我吐露道,當(dāng)她第一次看到實(shí)時(shí)操縱計(jì)算機(jī)3D圖象時(shí),她不知道這是怎么實(shí)現(xiàn)的,也不知道計(jì)算機(jī)如何能夠存儲(chǔ)3D圖象。今天這對(duì)于在大街上的普通人來(lái)說(shuō)或許是真實(shí)的,即使他們時(shí)常玩PC游戲,游戲機(jī)游戲,或街機(jī)游戲。下面我們將從游戲設(shè)計(jì)者的角度討論創(chuàng)造3D世界的一些細(xì)節(jié),你也應(yīng)該看一看DaveSalvator所寫的“3D管線導(dǎo)論“,以便對(duì)3D圖象生成的主要過(guò)程有一個(gè)整體的了解。3D3D世界中的一系列點(diǎn)(被稱為頂點(diǎn)),彼此之間有相互關(guān)系,所以計(jì)算機(jī)知道如何在世界中的這些點(diǎn)之間畫線或者是填充表面。一個(gè)立方體由8個(gè)點(diǎn)組6個(gè)表面,分別代表它的每一個(gè)面。這就是3D對(duì)象儲(chǔ)存的基礎(chǔ)。對(duì)于一些比較復(fù)雜的3D物體,比如說(shuō)一個(gè)Quake的關(guān)卡,將有數(shù)以千計(jì)(有時(shí)數(shù)以十萬(wàn)計(jì))的頂點(diǎn),和數(shù)以千計(jì)的多邊形表面。本質(zhì)上與上面的立方體例子類似,它僅僅是由許許多多的小多邊形組成的一些復(fù)雜場(chǎng)景。模型和世界如何儲(chǔ)存是渲染器的一部份功能,而不屬于應(yīng)用程序/游戲部份。游戲邏輯不需要知道對(duì)象在內(nèi)存中如何表示,也不需要知道渲染器將怎樣把他們顯示出來(lái)。游戲只是需要知道渲染器將使用正確的視野去表示對(duì)象,并將在正確的動(dòng)畫幀中把正確的模型顯示出來(lái)。在一個(gè)好的引擎中,渲染器應(yīng)該是可以完全被一個(gè)新的渲染器替換掉,并且不需要去改動(dòng)游戲的一行代碼。許多跨平臺(tái)引擎,而且許多自行開(kāi)發(fā)的游戲機(jī)引擎就是這樣的,如Unreal引擎,--舉例來(lái)說(shuō),這個(gè)游戲GameCube版本的渲染器就可以被你任意的替換掉。讓我們?cè)倏纯磧?nèi)部的表示方法—除了使用坐標(biāo)系統(tǒng),還有其他方法可以在計(jì)算機(jī)內(nèi)存里表示空間的點(diǎn)。在數(shù)學(xué)上,你可以使用一個(gè)方程式來(lái)描述直線或曲線,并得到多邊形,而幾乎所有的3D顯示卡都使用多邊形來(lái)作為它們的最終渲染圖元。一個(gè)圖元就是你在任何顯示卡上面所能使用的最低級(jí)的繪制(渲染)單位,幾乎所有的硬件都是使用三個(gè)頂點(diǎn)的多邊形(三角形)。新一代的nVidia和ATI顯卡可以允許你以數(shù)學(xué)方式渲染(被稱為高次表面),但因?yàn)檫@不是所有圖形卡的標(biāo)準(zhǔn),你還不能靠它作為渲染策略。從計(jì)算的角度來(lái)看,這通常有些昂貴,但它時(shí)常是新的實(shí)驗(yàn)技術(shù)的基礎(chǔ),例如,地表的渲染,或者對(duì)物件銳利的邊緣進(jìn)行柔化。我們將會(huì)在下面的曲面片小節(jié)中更進(jìn)一步介紹這2/30些高次表面。剔除概觀問(wèn)題來(lái)了。我現(xiàn)在有一個(gè)由幾十萬(wàn)個(gè)頂點(diǎn)/多邊形描述的世界。我以第一人稱視角位于我們這個(gè)3D世界的一邊。在視野中可以看見(jiàn)世界的一些多邊形,而另外一些則不可見(jiàn),因?yàn)橐恍┪矬w,比如一面看得見(jiàn)的墻壁,遮擋住了它們。即使是最好的游戲編碼人員,在目前的3D顯卡上,在一個(gè)視野中也不能處理300,000個(gè)三角形且仍然維持60fps(一個(gè)主要目標(biāo))。顯卡不能處理它,因此我們必須寫一些代碼,在把它們交給顯卡處理之前除去那些看不見(jiàn)的多邊形。這個(gè)過(guò)程被稱為剔除。有許多不同的剔除方法。在深入了解這些之前,讓我們探討一下為什么圖形顯示卡不能處理超高數(shù)量的多邊形。我是說(shuō),最新的圖形卡每秒鐘不能處理幾百萬(wàn)個(gè)多邊形嗎?它不應(yīng)該能夠處理嗎?首先,你必須理解市場(chǎng)銷售宣稱的多邊形生成率和真實(shí)世界的多邊形生成率。行銷上宣稱的多邊形生成率是圖形顯示卡理論上能夠達(dá)到的多邊形生成率。如果全部多邊形都在屏幕上,相同的紋理,相同的尺寸大小,正在往顯示卡上傳送多邊形的應(yīng)用程序除了傳送多邊形以外什么也不做,這時(shí)顯卡能處理多少多邊形數(shù)量,就是圖形芯片廠商呈現(xiàn)給你的數(shù)字。--多邊形的3D變換,光照計(jì)算,拷貝較多的紋理到顯卡內(nèi)存,等等。不僅紋理要送到顯示卡,而且還有每個(gè)多邊形的細(xì)節(jié)。一些比較新的顯卡允許你實(shí)際上在顯卡內(nèi)存本身里面儲(chǔ)存模型/世界幾何細(xì)節(jié),但這可能是昂貴的,將會(huì)耗光紋理正??梢允褂玫目臻g,所以你最好能確定每一幀都在使用這些模型的頂點(diǎn),否則你只是在浪費(fèi)顯示卡上的存儲(chǔ)空間。我們就說(shuō)到這里了。重要的是,在實(shí)際使用顯卡時(shí),并不必然就能達(dá)到你在顯卡包裝盒上所看到的那些指標(biāo),如果你有一個(gè)比較慢速的CPU,或沒(méi)有足夠的內(nèi)存時(shí),這種差異就尤為真實(shí)?;镜奶蕹椒ㄗ詈?jiǎn)單的剔除方式就是把世界分成區(qū)域,每個(gè)區(qū)域有一個(gè)其他可見(jiàn)區(qū)域的列表。那樣,你只需要顯示針對(duì)任何給定點(diǎn)的可見(jiàn)部分。如何生成可見(jiàn)視野區(qū)域的列表是技巧所在。再者,有許多方法可以用來(lái)生成可見(jiàn)區(qū)域列表,如BSP樹(shù),窺孔等等??梢钥隙?,當(dāng)談?wù)揇OOM或QUAKE時(shí),你已經(jīng)聽(tīng)到過(guò)使用BSP這個(gè)術(shù)語(yǔ)了。它表示二叉空間分割。BSP是一種將世界分成小區(qū)域的的方法,通過(guò)組織世界的多邊形,容易確定哪些區(qū)域是可見(jiàn)的而哪些是不可見(jiàn)的–從而方便了那些不想做太多繪制工作的基于軟件的渲染器。它同時(shí)也以一種非常有效的方式讓你知道你位于世界中的什么地方。在基于窺孔的引擎(最早由3DRealms已經(jīng)取消的Prey項(xiàng)目引入游戲世界)個(gè)區(qū)域(或房間)都建造有自己的模型,通過(guò)每個(gè)區(qū)域的門(或窺孔)能夠看見(jiàn)另外的區(qū)段。渲染器把每個(gè)區(qū)域作為獨(dú)立的場(chǎng)景單獨(dú)繪制。這就是它的大致原理。足以說(shuō)這是任何一個(gè)渲染器的必需部份,而且非常重要。盡管一些這樣的技術(shù)歸類在"遮擋剔除"之下,但是他們?nèi)慷加型瑯拥哪康?盡早消除不必要的工作。對(duì)於一個(gè)FPS游戲(第一人稱射擊游戲)而且游戲玩家承擔(dān)視野的控制,丟棄或者剔除不可見(jiàn)的三角形就是絕對(duì)必要的了。對(duì)空間模擬來(lái)說(shuō)也是這樣的,你可以看見(jiàn)很遠(yuǎn)很遠(yuǎn)的地方–剔除超過(guò)視覺(jué)范圍外面的東西就非常重要。對(duì)于視野受到限制的游戲來(lái)說(shuō)–比如RTS(即時(shí)戰(zhàn)略類游戲)--通常比較容易實(shí)現(xiàn)。通常渲染器的這個(gè)部份還是由軟件來(lái)完成,而不是由顯卡完成,由顯卡來(lái)做這部分3/30工作只是一個(gè)時(shí)間問(wèn)題?;镜膱D形管線流程一個(gè)簡(jiǎn)單的例子,從游戲到多邊形繪制的圖形管線過(guò)程大致是這樣:?游戲決定在游戲中有哪些對(duì)象,它們的模型,使用的紋理,他們可能在什么動(dòng)畫幀,以及它們?cè)谟螒蚴澜缋锏奈恢?。游戲也決定照相機(jī)的位置和方向。?游戲把這些信息傳遞給渲染器。以模型為例,渲染器首先要查看模型的大小,照相機(jī)的位置,然後決定模型在屏幕上是否全部可見(jiàn),或者在觀察者(照相機(jī)視野)的左邊,在觀察者的后面,或距離很遠(yuǎn)而不可見(jiàn)。它甚至?xí)褂靡恍┦澜鐪y(cè)定方式來(lái)計(jì)算出模型是否是可見(jiàn)的。(參見(jiàn)下面這條)?世界可視化系統(tǒng)決定照相機(jī)在世界中的位置,并根據(jù)照相機(jī)視野決定世界的哪些區(qū)域/多邊形是可見(jiàn)的。有許多方法可以完成這個(gè)任務(wù),包括把世界分割成許多區(qū)域的暴力方法,每個(gè)區(qū)域直接為"我能從區(qū)域D看見(jiàn)區(qū)域AB&C",到更精致的BSP(二叉空間分割)世界。所有通過(guò)這些剔除測(cè)試的多邊形被傳遞給多邊形渲染器進(jìn)行繪制。?對(duì)於每一個(gè)被傳遞給渲染器的多邊形,渲染器依照局部數(shù)學(xué)(也就是模型動(dòng)畫)和世界數(shù)學(xué)(相對(duì)于照相機(jī)的位置?)對(duì)多邊形進(jìn)行變換,并檢查決定多邊形是不是背對(duì)相機(jī)(也就是遠(yuǎn)離照相機(jī))。背面的多邊形被丟棄。非背面的多邊形由渲染器根據(jù)發(fā)現(xiàn)的附近燈光照亮。然后渲染器要看多邊形使用的紋理,并且確定API/圖形卡正在使用那種紋理作為它的渲染基礎(chǔ)。在這里,多邊形被送到渲染API,然后再送給顯卡。很明顯這有些過(guò)分簡(jiǎn)單化了,但你大概理解了。下面的圖表摘自DaveSalvator's3D管線一文,可以給你多一些具體細(xì)節(jié):3D管線-高層的概觀1.應(yīng)用程序/場(chǎng)景?場(chǎng)景/幾何數(shù)據(jù)庫(kù)遍歷?對(duì)象的運(yùn)動(dòng),觀察相機(jī)的運(yùn)動(dòng)和瞄準(zhǔn)?對(duì)象模型的動(dòng)畫運(yùn)動(dòng)?3D世界內(nèi)容的描述?對(duì)象的可見(jiàn)性檢查,包括可能的遮擋剔除?細(xì)節(jié)層次的選擇(LOD)2.幾何圖元?變換(旋轉(zhuǎn),平移,縮放)?從模型空間到世界空間的變換(Direct3D)?從世界空間到觀察空間變換?觀察投影?細(xì)節(jié)接受/拒絕剔除?背面剔除(也可以在后面的屏幕空間中做)?光照處理?透視分割-變換到裁剪空間?裁剪?變換到屏幕空間3.三角形生成?背面剔除(或者在光照計(jì)算之前的觀察空間中完成)4/30?斜率/角度計(jì)算?掃瞄線變換4.渲染/光柵化?著色?紋理?霧?Alpha透明測(cè)試?深度緩沖?抗鋸齒(可選擇的)?顯示通常你會(huì)把所有的多邊形放到一些列表內(nèi),然後根據(jù)紋理對(duì)這個(gè)列表排序(這樣你只需要對(duì)顯卡傳送一次紋理,而不是每個(gè)多邊形都傳送一次),等等。在過(guò)去,會(huì)把多邊形按照它們到相機(jī)的距離進(jìn)行排序,首先繪制那些距離相機(jī)最遠(yuǎn)的多邊形,但現(xiàn)在由于Z緩沖的出現(xiàn),這種方法就不是那么重要了。當(dāng)然那些透明的多邊形要除外,它們要在所有的非半透明多邊形繪制之后才能夠繪制,這樣一來(lái),所有在它們后面的多邊形就能正確地在場(chǎng)景中顯現(xiàn)出來(lái)。當(dāng)然,象那樣,實(shí)際上你必須得從后到前地繪制那些多邊形。但時(shí)常在任何給定的FPS游戲場(chǎng)景中,通常沒(méi)有太多透明的多邊形。它可能看起來(lái)像有,但實(shí)際上與那些不透明的多邊形相比,其比率是相當(dāng)?shù)偷?。一旦?yīng)用程序?qū)?chǎng)景傳遞到API,API就能利用硬件加速的變換和光照處理(T&L),這在如今的3D顯卡中是很平常的事情。這里不討論涉及到的矩陣數(shù)學(xué)(參見(jiàn)Dave的3D管線導(dǎo)論),幾何變換允許3D顯卡按照你的嘗試,根據(jù)相機(jī)在任何時(shí)間的位置和方向,在世界的正確角度和位置繪制多邊形。對(duì)于每個(gè)點(diǎn)或頂點(diǎn)都有大量的計(jì)算,包括裁剪運(yùn)算,決定任何給定的多邊形實(shí)際上是否可見(jiàn),在屏幕上完全不可見(jiàn)或部分可見(jiàn)。光照運(yùn)算,計(jì)算紋理色彩明亮程度,這取決于世界的燈光從什么角度如何投射到頂點(diǎn)上。過(guò)去,處理器處理這些計(jì)算,但現(xiàn)在,當(dāng)代圖形硬件就能為你做這些事情,這意謂著你的處理器可以去做其他的事情了。很明顯這是件好事情?,由于不能指望市面上所有的3D顯卡板上都有T&,所以無(wú)論如何你自己將必須寫所有的這些例程(再一次從游戲開(kāi)發(fā)者角度來(lái)說(shuō))。你將在本文各處的不同段落看到"好事情(tm)"這個(gè)詞匯。我認(rèn)為,這些特征為使游戲看起來(lái)更好作出了非常有用的貢獻(xiàn)。毫不令人吃驚,你也將會(huì)看見(jiàn)它的對(duì)立面;你猜到了,那就是“壞事情我正在嘗試爭(zhēng)取這些詞匯的版權(quán),你要使用他們就得支付一筆小小的費(fèi)用喲。曲面片(高次表面)除了三角形,曲面片的使用現(xiàn)在正變得更普遍。因?yàn)樗麄兡苡脭?shù)學(xué)表達(dá)式來(lái)描述幾何(通常涉及某種曲線的幾何形體)置,所以曲面片(高次表面的另一個(gè)名稱)非常好。這樣,你實(shí)際上就能夠動(dòng)態(tài)地根據(jù)方程式來(lái)建立(和變形)多邊形網(wǎng)格,并決定你實(shí)際想要從曲面片上看到的多邊形數(shù)量。因此,舉例來(lái)說(shuō),你可以描述一個(gè)管道,然后在世界中就可以有這種管道的許多樣例。在一些房間中,你已經(jīng)顯示了10,000個(gè)多邊形,你可以說(shuō),"因?yàn)槲覀円呀?jīng)顯示了大量的多邊形,而且任何更多的多邊形將會(huì)使幀速率下降,所以這個(gè)管道應(yīng)該只有100個(gè)多邊形"。但在另外一個(gè)房間中,視野中只有5000個(gè)可見(jiàn)的多邊形,你可以說(shuō),"因?yàn)槲覀冞€沒(méi)有達(dá)到預(yù)算可以顯示的多邊形數(shù)量,所以,現(xiàn)在這個(gè)管道能有500個(gè)多邊形"。非常美妙的東西--通過(guò)AGP傳5/30送同一個(gè)對(duì)象的曲面方程確實(shí)要比傳送其大量頂點(diǎn)節(jié)省成本。SOF2就使用了這個(gè)方法的一種變體來(lái)建立它的地表系統(tǒng)。事實(shí)上現(xiàn)在的ATI顯卡具有TruForm,它能帶一個(gè)以三角形為基礎(chǔ)的模型,并將該模—接著再用十倍三角形數(shù)量把模型轉(zhuǎn)換回基于大量三角形的模型(被稱為retesselation)。然后模型送往管線做進(jìn)一步的處理。實(shí)際上ATI僅僅在T&L引擎之前增加了一個(gè)階段來(lái)處理這個(gè)過(guò)程。這里的缺點(diǎn)是,要控制哪些模型需要被平滑處理而哪些又不需要。你常常想要一些邊緣比較尖銳,比如鼻子,但它卻被不恰當(dāng)?shù)钠交^(guò)了。這仍然是一種很好的技術(shù),而且我能預(yù)見(jiàn)它在將來(lái)會(huì)被更多的應(yīng)用。這就是第一部份--我們將會(huì)在第二部分繼續(xù)介紹光照和紋理,下面的章節(jié)會(huì)更加深入。第2部份:3D環(huán)境的光照和紋理世界的燈光在變換過(guò)程中,通常是在稱為觀察空間的坐標(biāo)空間中,我們遇到了最重要的運(yùn)算之一:光照計(jì)算。它是一種這樣的事情,當(dāng)它工作時(shí),你不關(guān)注它,但當(dāng)它不工作時(shí),你就非常關(guān)注它了。有很多不同的光照方法,從簡(jiǎn)單的計(jì)算多邊形對(duì)于燈光的朝向,并根據(jù)燈光到多邊形的方向和距離加上燈光顏色的百分比值,一直到產(chǎn)生邊緣平滑的燈光貼圖疊加基本紋理。而且一些API實(shí)際上提供預(yù)先建造的光照方法。舉例來(lái)說(shuō),OpenGL提供了每多邊形,每頂點(diǎn),和每像素的光照計(jì)算。在頂點(diǎn)光照中,你要決定一個(gè)頂點(diǎn)被多少個(gè)多邊形共享,并計(jì)算出共享該頂點(diǎn)的所有多邊形法向量的均值(稱為法向量),并將該法向量賦頂點(diǎn)。一個(gè)給定多邊形的每個(gè)頂點(diǎn)會(huì)有不同的法向量,所以你需要漸變或插值多邊形頂點(diǎn)的光照顏色以便得到平滑的光照效果。你沒(méi)有必要用這種光照方式查看每個(gè)單獨(dú)的多邊形。這種方式的優(yōu)點(diǎn)是時(shí)??梢允褂糜布D(zhuǎn)換與光照(T&L)來(lái)幫助快速完成。不足之處是它不能產(chǎn)生陰影。舉例來(lái)說(shuō),即使燈光是在模型的右側(cè),左手臂應(yīng)該在被身體投影的陰影中,而實(shí)際上模型的雙臂卻以同樣的方式被照明了。這些簡(jiǎn)單的方法使用著色來(lái)達(dá)到它們的目標(biāo)。當(dāng)用平面光照繪制一個(gè)多邊形時(shí),你讓(該方法中,多邊形均對(duì)應(yīng)一個(gè)光強(qiáng)度,表面上所有點(diǎn)都用相同的強(qiáng)度值顯示,渲染繪制時(shí)得到一種平面效果,多邊形的邊緣不能精確的顯示出來(lái))。對(duì)于頂點(diǎn)著色(Gouraud著色),你讓渲染引擎給每個(gè)頂點(diǎn)賦予特定的顏色。在繪制多邊形上各點(diǎn)投影所對(duì)應(yīng)的像素時(shí),根據(jù)它們與各頂點(diǎn)的距離,對(duì)這些頂點(diǎn)的顏色進(jìn)行插值計(jì)算。(實(shí)際上QuakeIII模型使用的就是這種方法,效果好的令人驚奇)。還有就是PhongGouraud著色,通過(guò)紋理工作,但不對(duì)每個(gè)頂點(diǎn)顏色進(jìn)行插值決定像素顏色值,它對(duì)每個(gè)頂點(diǎn)的法向量進(jìn)行插值,會(huì)為每個(gè)頂點(diǎn)投影的像素做相同Gouraud著色,你需要知道哪些光投射在每個(gè)頂點(diǎn)上。對(duì)于Phong對(duì)每個(gè)像素也要知道這么多。一點(diǎn)也不令人驚訝,Phong著色可以得到更加平滑的效果,因?yàn)槊總€(gè)像素都需要進(jìn)行光照計(jì)算,其繪制非常耗費(fèi)時(shí)間。平面光照處理方法很快速,但比較粗糙。Phong著色比Gouraud著色計(jì)算更昂貴,但效果最好,可以達(dá)到鏡面高光效果("高亮")。這些都需要你在游戲開(kāi)發(fā)中折衷權(quán)衡。6/30多重紋理與凹凸映射單一紋理映射給整個(gè)3D真實(shí)感圖形帶來(lái)很大的不同,但使用多重紋理甚至可以達(dá)到但許多具有多流水線的3D加速卡,如ATI'sRadeon和nVidia'sGeForce2及更高級(jí)的顯卡,多重紋理可以在一遍渲染(繪制)過(guò)程中完成。產(chǎn)生多重紋理效果時(shí),你先用一個(gè)紋理繪制多邊形,然后再用另外一個(gè)紋理透明地繪制在多邊形上面。這讓你可以使紋理看上去在移動(dòng),或脈動(dòng),甚至產(chǎn)生陰影效果(我們?cè)谡彰饕还?jié)中描述過(guò))。繪制第一個(gè)紋理映射,然后在上面繪制帶透明的全黑紋理,引起一種是所有的織法黑色的但是有一個(gè)透明分層堆積過(guò)它的頂端,這就是--即時(shí)陰影。該技術(shù)被稱為照明映射(有時(shí)也稱為暗映射)至新的Doom,一直是Id引擎里關(guān)卡照明的傳統(tǒng)方法。Matrox第一個(gè)在流行的3D游戲中發(fā)起使用各種不同形式的凹凸貼圖。就是生成紋理來(lái)表現(xiàn)燈光在表面的投射,表現(xiàn)表面的凹凸或表面的裂縫。凹凸貼圖并不隨著燈光一起移動(dòng)--它被設(shè)計(jì)用來(lái)表現(xiàn)一個(gè)表面上的細(xì)小瑕疵,而不是大的凹凸。比如說(shuō),在飛行模擬器中,你可以使用凹凸貼圖來(lái)產(chǎn)生像是隨機(jī)的地表細(xì)節(jié),而不是重復(fù)地使用相同的紋理,看上去一點(diǎn)趣味也沒(méi)有。凹凸貼圖產(chǎn)生相當(dāng)明顯的表面細(xì)節(jié),盡管是很高明的戲法,但嚴(yán)格意義上講,凹凸貼圖并不隨著你的觀察角度而變化。比較新的ATI和nVidia顯卡片能執(zhí)行每像素運(yùn)算,這種缺省觀察角度的不足就真的不再是有力而快速的法則了。無(wú)論是哪一種方法,到目前為止,沒(méi)有游戲開(kāi)發(fā)者太多的使用;更多的游戲能夠且應(yīng)該使用凹凸貼圖。高速緩存抖動(dòng)=糟糕的事物紋理高速緩存的管理游戲引擎的速度至關(guān)重要。和任何高速緩存一樣,緩存命中很好,而不命中將很糟糕。如果遇到紋理在圖形顯示卡內(nèi)存被頻繁地?fù)Q入換出的情況,這就是紋理高速緩存抖動(dòng)。發(fā)生這種情況時(shí),通常API將會(huì)廢棄每個(gè)紋理,結(jié)果是所有的紋理在下一幀將被重新加載,這非常耗時(shí)和浪費(fèi)。對(duì)游戲玩家來(lái)說(shuō),當(dāng)API重新加載紋理高速緩存時(shí),會(huì)導(dǎo)致幀速率遲鈍。在紋理高速緩存管理中,有各種不同的技術(shù)將紋理高速緩存抖動(dòng)減到最少–這是確保任何3D游戲引擎速度的一個(gè)決定性因素。紋理管理是件好事情–這意味著只要求顯卡使用紋理一次,而不是重復(fù)使用。這聽(tīng)起來(lái)有點(diǎn)自相矛盾,但效果是它意謂著對(duì)顯卡說(shuō),"看,所有這些多邊形全部使用這一個(gè)紋理,我們能夠僅僅加載這個(gè)紋理一次而不是許多次嗎?"這阻止API(或圖形驅(qū)動(dòng)軟件)上傳多次向顯卡加載紋理。象OpenGL這樣的API實(shí)際上通常處理紋理高速緩存管理,意謂著,根據(jù)一些規(guī)則,比如紋理存取的頻率,API決定哪些紋理儲(chǔ)存在顯卡上,哪些紋理存儲(chǔ)在主存。真正的問(wèn)題來(lái)了:a)你時(shí)常無(wú)法知道API正在使用的準(zhǔn)確規(guī)則。b)你時(shí)常要求在一幀中繪制更多的紋理,以致超出了顯卡內(nèi)存空間所能容納的紋理。另外一種紋理高速緩存管理技術(shù)是我們?cè)缦扔懻摰募y理壓縮。很象聲音波形文件被壓縮成MP3文件,盡管無(wú)法達(dá)到那樣的壓縮比率,但紋理可以被壓縮。從聲音波形文件到MP3的壓縮可以達(dá)到11:1的壓縮比率,而絕大多數(shù)硬件支持的紋理壓縮運(yùn)算法則只有4:1的壓縮比率,盡管如此,這樣能產(chǎn)生很大的差別。除此之外,在渲染(繪制)過(guò)程中,只有在需要時(shí),硬件才動(dòng)態(tài)地對(duì)紋理進(jìn)行解壓縮。這一點(diǎn)非常棒,我們僅僅擦除即將可能用到的表面。如上所述,另外一種技術(shù)確保渲染器要求顯卡對(duì)每個(gè)紋理只繪制一次。確定你想要渲染(繪制)的使用相同紋理的所有多邊形同時(shí)送到顯卡,而不是一個(gè)模型在這里,另一個(gè)模型7/30AGP接口傳送一次。QuakeIII在其陰影系統(tǒng)就是這么做的。處理多邊形時(shí),把它們加入到一個(gè)內(nèi)部的陰影列表,一旦所有的多邊形處理完畢,渲染器遍歷紋理列表,就將紋理及所有使用這些紋理的多邊形同時(shí)傳送出去。上述過(guò)程在使用顯卡的硬件T&L(如果支持的話)時(shí),并不怎么有效。你面臨的結(jié)局是,滿屏幕都是使用相同紋理的大量的多邊形小群組,所有多邊形都使用不同的變換矩陣。這意謂著更多的時(shí)間花在建立顯卡的硬件T&L引擎無(wú)論如何,因?yàn)樗麄冇兄趯?duì)整個(gè)模型使用統(tǒng)一的紋理,所以它對(duì)實(shí)際屏幕上的模型可以有效地工作。通常它沒(méi)有這么嚴(yán)重,因?yàn)榇篌w而言,世界的紋理不會(huì)有那么大,這樣一來(lái)API的紋理緩存系統(tǒng)將會(huì)替你處理這些,并把紋理保留在顯卡以備再次使用。在游戲機(jī)上,通常沒(méi)有紋理高速緩存系統(tǒng)(除非你寫一個(gè))。在PS2上面,你最好是遠(yuǎn)離"一次紋理"Xbox上面,這是不重要的,因?yàn)樗旧頉](méi)有圖形內(nèi)存(它是UMA體系結(jié)構(gòu)),且所有的紋理無(wú)論如何始終保留在主存之中。事實(shí)上,在今天的現(xiàn)代PCFPS游戲中,試圖通過(guò)AGP接口傳送大量紋理是第二個(gè)最通常的瓶頸。最大的瓶頸是實(shí)際幾何處理,它要使東西出現(xiàn)在它應(yīng)該出現(xiàn)的地方。在如今的3DFPS游戲中,最耗費(fèi)時(shí)間的工作,顯然是那些計(jì)算模型中每個(gè)頂點(diǎn)正確的世界位置的數(shù)學(xué)運(yùn)算。如果你不把場(chǎng)景的紋理保持在預(yù)算之內(nèi),僅居其次的就是通過(guò)AGP接口傳送大量的紋理了。然而,你確實(shí)有能力影響這些。通過(guò)降低頂層的MIP級(jí)別(還記得系統(tǒng)在哪里不斷地為你細(xì)分紋理嗎?),你就能夠把系統(tǒng)正在嘗試送到顯卡的紋理大小減少一半。你的視覺(jué)質(zhì)量會(huì)有所下降--尤其是在引人注目的電影片斷中--但是你的幀速率上升了。這種方式對(duì)網(wǎng)絡(luò)游戲尤其有幫助。實(shí)際上,SoldierofFortuneII和JediKnightII:Outcast這兩款游戲在設(shè)計(jì)時(shí)針對(duì)的顯卡還不是市場(chǎng)上的大眾主流顯卡。為了以最大大小觀看他們的紋理,你的3D顯卡至少需要有128MB的內(nèi)存。這兩種產(chǎn)品在思想上都是給未來(lái)設(shè)計(jì)的。上面就是第2部份。在下面章節(jié)中,我們將介紹許多主題,包括內(nèi)存管理,霧效果,深度測(cè)試,抗鋸齒,頂點(diǎn)著色,API等第3部分:模板陰影與深度測(cè)試用模板產(chǎn)生陰影效果,事情就變得復(fù)雜而昂貴了。這里不討論太多細(xì)節(jié)(可以寫成一篇單獨(dú)的文章了),其思想是,從光源視角繪制模型視圖,然后用這個(gè)把多邊形紋理形狀產(chǎn)生或投射到受影響的物體表面。實(shí)際上你是在視野中投射將會(huì)“落”在其他多邊形上面的光體。最后你得到看似真實(shí)的光照,甚至帶有視角在里面。因?yàn)橐獎(jiǎng)討B(tài)創(chuàng)建紋理,并對(duì)同一場(chǎng)景進(jìn)行多遍繪制,所以這很昂貴。你能用眾多不同方法產(chǎn)生陰影,情形時(shí)常是這樣一來(lái),渲染質(zhì)量與產(chǎn)生效果所需要的渲染工作成比例。有所謂的硬陰影或軟陰影之分,而后者較好,因?yàn)樗鼈兏訙?zhǔn)確地模仿陰影通常在真實(shí)世界的行為。通常有一些被游戲開(kāi)發(fā)者偏愛(ài)的“足夠好”的方法。如要更多的了解陰影,請(qǐng)參考DaveSalvator的3D流水線一文。深度測(cè)試現(xiàn)在我們開(kāi)始討論深度測(cè)試,深度測(cè)試丟棄隱藏的像素,過(guò)度繪制開(kāi)始起作用。過(guò)度繪制非常簡(jiǎn)單–在一幀中,你數(shù)次繪制一個(gè)像素位置。它以3D場(chǎng)景中Z(深度)方向上存在的元素?cái)?shù)量為基礎(chǔ),也被稱為深度復(fù)雜度。如果你常常太多的過(guò)度繪制,--舉例來(lái)說(shuō),8/30符咒的眩目視覺(jué)特效,就象HereticII,能讓你的幀速率變得很糟糕。當(dāng)屏幕上的一些人們彼此施放符咒時(shí),HereticII設(shè)計(jì)的一些最初效果造成的情形是,他們?cè)谝粠袑?duì)屏幕上每個(gè)相同的像素畫了40次!不用說(shuō),這必須調(diào)整,尤其是軟件渲染器,除了將游戲降低到象是滑雪表演外,它根本不能處理這樣的負(fù)荷。深度測(cè)試是一種用來(lái)決定在相同的像素位置上哪些對(duì)象在其它對(duì)象前面的技術(shù),這樣我們就能夠避免繪制那些隱藏的對(duì)象??粗鴪?chǎng)景并想想你所看不見(jiàn)的。換句話說(shuō),是什么在其他場(chǎng)景對(duì)象前面,或者隱藏了其他場(chǎng)景對(duì)象?是深度測(cè)試作出的這個(gè)決定。我將進(jìn)一步解釋深度如何幫助提高幀速率。想像一個(gè)很瑣細(xì)的場(chǎng)景,大量的多邊形(或像素)位于彼此的后面,在渲染器獲得他們之間沒(méi)有一個(gè)快速的方法丟棄他們。對(duì)非Alpha混合的多邊形分類排序(在Z-方向上),首先渲染離你最近的那些多邊形,優(yōu)先使用距離最近的像素填充屏幕。所以當(dāng)你要渲染它們后面的像素(由Z像素很快被丟棄,從而避免了混合步驟并節(jié)省了時(shí)間。如果你從后到前繪制,所有隱藏的對(duì)象將被完全繪制,然后又被其他對(duì)象完全重寫覆蓋。場(chǎng)景越復(fù)雜,這種情況就越糟糕,所以深度測(cè)試是個(gè)好東西??逛忼X讓我們快速的看一下抗鋸齒。當(dāng)渲染單個(gè)多邊形時(shí),3D顯卡仔細(xì)檢查已經(jīng)渲染的,并對(duì)新的多邊形的邊緣進(jìn)行柔化,這樣你就不會(huì)得到明顯可見(jiàn)的鋸齒形的像素邊緣。兩種技術(shù)方法之一通常被用來(lái)處理。第一種方法是單個(gè)多邊形層次,需要你從視野后面到前面渲染多邊形,這樣每個(gè)多邊形都能和它后面的進(jìn)行適當(dāng)?shù)幕旌稀H绻话葱蜻M(jìn)行渲染,最后你會(huì)看見(jiàn)各種奇怪的效果。在第二種方法中,使用比實(shí)際顯示更大的分辯率來(lái)渲染整幅幀畫面,然后在你縮小圖像時(shí),尖銳的鋸齒形邊緣就混合消失了。這第二種方法的結(jié)果不錯(cuò),但因?yàn)轱@卡需要渲染比實(shí)際結(jié)果幀更多的像素,所以需要大量的內(nèi)存資源和很高的內(nèi)存帶寬。多數(shù)新的顯卡能很好地處理這些,但仍然有多種抗鋸齒模式可以供你選擇,因此你可以在性能和質(zhì)量之間作出折衷。對(duì)於當(dāng)今流行的各種不同抗鋸齒技術(shù)的更詳細(xì)討論請(qǐng)參見(jiàn)DaveSalvator的3D流水線一文。頂點(diǎn)與像素著色在結(jié)束討論渲染技術(shù)之前,我們快速的說(shuō)一下頂點(diǎn)和像素著色,最近它們正引起很多關(guān)注。頂點(diǎn)著色是一種直接使用顯卡硬件特征的方式,不使用API。舉例來(lái)說(shuō),如果顯卡支持硬件T&L,你可以用DirectX或OpenGL編程,并希望你的頂點(diǎn)通過(guò)T&L單元(因?yàn)檫@完全由驅(qū)動(dòng)程序處理,所以沒(méi)有辦法確信),或者你直接利用顯卡硬件使用頂點(diǎn)著色。它們?cè)试S你根據(jù)顯卡自身特征進(jìn)行特別編碼,你自己特殊的編碼使用T&L引擎,以及為了發(fā)揮你的最大優(yōu)勢(shì),顯卡必須提供的其他別的特征。事實(shí)上,現(xiàn)在nVidia和ATI在他們大量的顯卡上都提供了這個(gè)特征。DirectX或者OpenGL那樣,為頂點(diǎn)著色編寫一次代碼就可以在任何顯卡上運(yùn)行,這可是個(gè)壞消息。然而,因?yàn)槟阒苯雍惋@卡硬件交流,它為快速渲染頂點(diǎn)著色可能生成的效果提供最大的承諾。(如同創(chuàng)造很不錯(cuò)的特效--你能夠使用頂點(diǎn)著色以API沒(méi)有提供的方式影響事物)。事實(shí)上,頂點(diǎn)著色正在真的將3D圖形顯示卡帶回到游戲機(jī)的編碼方式,直接存取硬件,最大限度利用系統(tǒng)的必須知識(shí),而不是依靠API來(lái)為你做一切。對(duì)一些程序員來(lái)說(shuō),會(huì)對(duì)這種編碼方式感到吃驚,但這是進(jìn)步代價(jià)。進(jìn)一步闡述,頂點(diǎn)著色是一些在頂點(diǎn)被送到顯卡渲染之前計(jì)算和運(yùn)行頂點(diǎn)效果程序或者例程。你可以在主CPU上面用軟件來(lái)做這些事情,或者使用顯卡上的頂點(diǎn)著色。為動(dòng)畫模9/30型變換網(wǎng)格是頂點(diǎn)程序的主選。像素著色是那些你寫的例程,當(dāng)繪制紋理時(shí),這些例程就逐個(gè)像素被執(zhí)行。你有效地用這些新的例程推翻了顯卡硬件正常情況做的混合模式運(yùn)算。這允許你做一些很不錯(cuò)的像素效,ATI和nVidia能實(shí)際上就像素著色版本達(dá)成一致(DX9's新的高級(jí)陰影語(yǔ)言將會(huì)幫助促進(jìn)這一目標(biāo)),我一點(diǎn)不驚訝DirectX和OpenGL采用Glide的方式--有幫助開(kāi)始,但最終不是把任何顯卡發(fā)揮到極限的最好方法。我認(rèn)為我會(huì)有興趣觀望將來(lái)。最后(In)最終,渲染器是游戲程序員最受評(píng)判的地方。在這個(gè)行業(yè),視覺(jué)上的華麗非常重要,因此它為知道你正在做的買單。對(duì)于渲染器程序員,最壞的因素之一就是3D顯卡工業(yè)界變化的速度。一天,你正在嘗試使透明圖像正確地工作;第二天nVidia正在做頂點(diǎn)著色編程的3D顯卡寫的代碼現(xiàn)在已經(jīng)過(guò)時(shí)了,需要全部重寫。甚至JohnCarmack這樣描述過(guò),他知道四年以前為充分發(fā)揮那個(gè)時(shí)期顯卡的性能所寫的不錯(cuò)的代碼,如今很平凡--因此他產(chǎn)生了為每個(gè)新的id項(xiàng)目完全重寫渲染器的欲望。Epic的TimSweeney贊同--這里是去年他給我的評(píng)論:我們已經(jīng)足足花費(fèi)了9Unreal被設(shè)計(jì)為軟件渲染和后來(lái)擴(kuò)展為硬件渲染。下一代引擎被設(shè)計(jì)為GeForce及更好的圖形顯示卡,且多邊形吞吐量是UnrealTournament的100倍。這需要全部替換渲染器。很幸運(yùn),該引擎模塊化程度足夠好,我們可以保持引擎的其余--不改動(dòng),盡管我們一直在以許多方式改進(jìn)這些部分。搭配長(zhǎng)篇文章的短篇報(bào)導(dǎo)(API--祝福和詛咒那么什么是API?它是應(yīng)用程序編程接口,將不一致的后端用一致的前端呈現(xiàn)出來(lái)。舉例來(lái)說(shuō),很大程度上每種3D顯示卡的3D實(shí)現(xiàn)方式都有所差別。然而,他們?nèi)慷汲尸F(xiàn)一個(gè)X3D顯示卡寫的代碼將會(huì)在Y3D顯示卡上面有相同的結(jié)果。好吧,不管怎樣理論上是那樣。大約在三年以前這可能是相當(dāng)真實(shí)的陳述,但自那以后,在nVidia公司的引領(lǐng)下,3D顯卡行業(yè)的事情發(fā)生了變化。如今在PC領(lǐng)域,除非你正計(jì)劃建造自己的軟件光柵引擎,使用CPU來(lái)繪制你所有的精靈,多邊形和粒子--而且人們?nèi)匀辉谶@樣做。跟UnrealAgeofEmpiresII:AgeofKings有一個(gè)優(yōu)秀的軟件渲染器–否則你將使用兩種可能的圖形API,OpenGL或者DirectX之一。OpenGL是一種真正的跨平臺(tái)API(使用這種API寫的軟件可以在Linux,Windows和MacOS上運(yùn)行。),而且有多年的歷史了,為人所熟知,但也開(kāi)始慢慢地顯示出它的古老。大約在四年以前,定義OpenGL驅(qū)動(dòng)特征集一直是所有顯示卡廠商工作的方向。然而,一旦在目標(biāo)達(dá)成以后,沒(méi)有預(yù)先制定特征工作方向的路線圖,這時(shí)候,所有的顯卡開(kāi)發(fā)商開(kāi)始在特征集上分道揚(yáng)鑣,使用OpenGL擴(kuò)展。3dfx創(chuàng)造了T-緩沖。nVidia努力尋求硬件變換和光照計(jì)算。Matrox努力獲取凹凸貼圖。等等。我以前說(shuō)過(guò)的一句話,"過(guò)去幾年以來(lái),3D顯示卡領(lǐng)域的事情發(fā)生了變化。"委婉地說(shuō)明了這一切。無(wú)論如何,另一個(gè)可以選擇的API是DirectX。這受Microsoft公司控制,且在PC和Xbox上被完美地支持。由于明顯的原因,DirectX沒(méi)有Apple或者Linux版本。因?yàn)镸icrosoft控制著DirectX,大體上它容易更好地集成在Windows里面。OpenGL和DirectXMicrosoft擁有。10/30如果你想要DirectX為你的3D顯示卡支持一個(gè)新的特征,那么你需要游說(shuō)微軟,希望采納你的愿望,并等待新的DirectXOpenGL,由于顯示卡制造商為3D顯示卡提供驅(qū)動(dòng)程序,你能夠通過(guò)OpenGL擴(kuò)展立即獲得顯示卡的新特征。這是好,但作為游戲開(kāi)50%,但你不能要求別人有一塊GeForce3來(lái)跑你的游戲。好吧,你可以這么做,但如果你想來(lái)年還在這個(gè)行業(yè)的話,這是個(gè)相當(dāng)愚蠢的主意。這是對(duì)這個(gè)問(wèn)題極大的簡(jiǎn)單化,對(duì)我所有描述的也有各種例外情況,但這里一般的思想DirectX,在任何既定時(shí)間你容易確切地知道你能從顯示卡獲得的特征,如果一個(gè)特征不能獲得,DirectX將會(huì)用軟件模擬它(也不總是一件好事情,因?yàn)檫@樣有時(shí)侯非常的慢,但那是另外一回事)。對(duì)于OpenGL,你可以更加貼近顯示卡的特征,但代價(jià)是不能確定將會(huì)獲得的準(zhǔn)確特征。第4部份:模型與動(dòng)畫,細(xì)節(jié)級(jí)別角色建模與動(dòng)畫你的角色模型在屏幕上看起來(lái)怎么樣,怎樣容易創(chuàng)建它們,紋理,以及動(dòng)畫對(duì)于現(xiàn)代游戲試圖完成的`消除不可信`,包括較高的多邊形數(shù)量模型,和讓模型在屏幕上移動(dòng)的更好方式。如今你需要一個(gè)骨骼模型系統(tǒng),有骨架和網(wǎng)格細(xì)節(jié)層次,單個(gè)頂點(diǎn)骨架的評(píng)估,骨架動(dòng)像動(dòng)畫混合,骨架反向運(yùn)動(dòng)學(xué)(IK還能夠繼續(xù)列下去。但是真的,在用專業(yè)行話說(shuō)了所有這些以后,我們?cè)谶@里真正談?wù)摰氖鞘裁茨??讓我們看看。讓我們定義一個(gè)基于網(wǎng)格的系統(tǒng)和一個(gè)骨骼動(dòng)畫系統(tǒng)作為開(kāi)始。在基于網(wǎng)格的系統(tǒng),對(duì)于每一個(gè)動(dòng)畫幀,你要定義模型網(wǎng)格的每個(gè)點(diǎn)在世界中的位置。舉例來(lái)說(shuō),你有一個(gè)包含200個(gè)多邊形的手的模型,有300個(gè)頂點(diǎn)(注意,在頂點(diǎn)和多邊形之間通常并不是3個(gè)對(duì)1個(gè)的關(guān)系,因?yàn)榇罅慷噙呅螘r(shí)常共享頂點(diǎn)–使用條形和扇形,你能大幅減少頂點(diǎn)數(shù)量)。如果動(dòng)畫有10幀,那么你就需要在內(nèi)存中有300個(gè)頂點(diǎn)位置的數(shù)據(jù)??偣灿?00x10=3000頂點(diǎn),每個(gè)頂點(diǎn)由xyz和顏色/alpha信息組成。你能看見(jiàn)這個(gè)增長(zhǎng)起來(lái)是多么的快。QuakeI,II和III都使用了這種系統(tǒng),這種系統(tǒng)確實(shí)有動(dòng)態(tài)變形網(wǎng)格的能力,比如使裙子擺動(dòng),或者讓頭發(fā)飄動(dòng)。相比之下,在骨骼動(dòng)畫系統(tǒng),網(wǎng)格是由骨架組成的骨骼(骨架是你運(yùn)動(dòng)的對(duì)象)。網(wǎng)格頂點(diǎn)和骨架本身相關(guān),所以它們?cè)谀P椭械奈恢枚际窍鄬?duì)于骨架,而不是網(wǎng)格代表每個(gè)頂點(diǎn)在世界中的位置。因此,如果你移動(dòng)骨架,組成多邊形的頂點(diǎn)的位置也相應(yīng)改變。這意謂著你只必須使骨骼運(yùn)動(dòng),典型情況大約有50個(gè)左右的骨架—很明顯極大地節(jié)省了內(nèi)存。骨骼動(dòng)畫附加的好處骨骼動(dòng)畫的另一個(gè)優(yōu)點(diǎn)是能夠根據(jù)影響頂點(diǎn)的一些骨架來(lái)分別“估價(jià)”每個(gè)頂點(diǎn)。例如,雙臂的骨架運(yùn)動(dòng),肩,脖子而且甚至軀干都能在肩中影響網(wǎng)格。當(dāng)你移動(dòng)軀干的時(shí)候,網(wǎng)格就活像一個(gè)角色一樣移動(dòng)。總的效果是3D角色能夠?qū)崿F(xiàn)的動(dòng)畫更加流暢和可信,且需要更少的內(nèi)存。每個(gè)人都贏了。當(dāng)然這里的缺點(diǎn)是,如果你想要使有機(jī)的東西運(yùn)動(dòng)且很好,比如說(shuō)頭發(fā),或者披肩,為了讓它看起來(lái)自然,你最后不得不在里面放置數(shù)量驚人的骨架,這會(huì)抬高一些處理時(shí)間。11/30基于骨骼的系統(tǒng)能帶給你的一些其他事情是‘忽略’特定層次骨架的能力--說(shuō),"我不關(guān)心動(dòng)畫想要對(duì)這塊骨架所做的事情,我想要讓它指向世界中的一個(gè)特定點(diǎn)"。這很棒。你能讓模型著眼于世界中的事件,或者使他們的腳在他們站著的地面保持水平。這一切非常微妙,但它可以幫助帶給場(chǎng)景附加的真實(shí)感。在骨骼系統(tǒng),你甚至可以指定"我需要把這個(gè)特別的動(dòng)畫用於模型的腿,而一個(gè)不同的攜槍或射擊動(dòng)畫在模型軀干上播放,且那家伙(角色)叫喊的不同動(dòng)畫效果在模型的頭部播放"Ghoul2(在SoldierofFortuneII:DoubleHelixandJediKnightI:Outcast中使用了Raven的動(dòng)畫系統(tǒng))擁有所有這些好東西,且特別被設(shè)計(jì)為允許程序員使用所有這些忽略能力。這對(duì)動(dòng)畫的節(jié)省像你一樣難以相信。像你一樣的動(dòng)畫上的這次救援不相信.Raven有一個(gè)角色行走的動(dòng)畫和一個(gè)站立開(kāi)火的動(dòng)畫,并在它同時(shí)行走和開(kāi)火形下把這兩個(gè)動(dòng)畫合并,而不是需要一個(gè)動(dòng)畫表示角色行走并開(kāi)火。MoreSkeletonsintheCloset先前描述的效果可以通過(guò)具有層次的骨骼系統(tǒng)來(lái)完成。這是什么意思呢?意思是每塊骨架實(shí)際上的位置相對(duì)于它的父親,而不是每個(gè)骨架直接位于空間中的地方。這意味著如果你移動(dòng)父親骨架,那么它所有的子孫骨架也跟著移動(dòng),在代碼上不需要任何額外的努力。這是讓你能夠在任何骨架層次改變動(dòng)畫,而且通過(guò)骨骼其余部分向下傳遞的東西。創(chuàng)建一個(gè)沒(méi)有層次的骨骼系統(tǒng)是可能的--但那時(shí)你不能忽略一個(gè)骨架并且預(yù)期它工作。你所看到的只是身體上的一個(gè)骨架開(kāi)始了新動(dòng)畫,除非你實(shí)現(xiàn)了某種‘向下傳遞信息’的系統(tǒng),否則在該骨架下面的其它骨架保持原來(lái)的動(dòng)畫。首先由一個(gè)層次系統(tǒng)開(kāi)始,你就自動(dòng)地獲得這些效果。許多今天的動(dòng)畫系統(tǒng)中正開(kāi)始出現(xiàn)一些比較新的特征,如動(dòng)畫混合,從一個(gè)正在播放的動(dòng)畫轉(zhuǎn)變到另外一個(gè)動(dòng)畫需要經(jīng)過(guò)一小段時(shí)間,而不是立即從一個(gè)動(dòng)畫突然轉(zhuǎn)變到另外一個(gè)。舉例來(lái)說(shuō),你有個(gè)角色在行走,然后他停了下來(lái)。你不是僅僅突然地轉(zhuǎn)變動(dòng)畫,讓他的腿和腳停在無(wú)效位置,而是一秒鐘混合一半,這樣腳似乎自然地移到了新的動(dòng)畫。不能夠過(guò)高的評(píng)價(jià)這種效果--混合是一個(gè)微妙的事情,但如果正確的運(yùn)用,它真的有些差別。反向運(yùn)動(dòng)學(xué)反向運(yùn)動(dòng)學(xué)(IK)是被許多人們丟棄的一個(gè)專業(yè)術(shù)語(yǔ),對(duì)它的真實(shí)含義沒(méi)有多少概念。IK是如今游戲里面一個(gè)相對(duì)比較新的系統(tǒng)。使用IK,模型的其余關(guān)節(jié)自動(dòng)重新定位,因此模型被正確定向。而且有模型的關(guān)節(jié)新位置的其馀者他們自己,因此模型正確的被定向。比如,你將會(huì)說(shuō),"好,手,去拾起桌子上的那個(gè)杯子"并指出杯子在世界中的位置。手就會(huì)移動(dòng)到那里,且它后面的身體會(huì)調(diào)節(jié)其自身以便雙臂移動(dòng),身體適當(dāng)彎曲,等等。也有和IK相反的事情,叫做前向運(yùn)動(dòng)學(xué),本質(zhì)上與IK工作的次序相反。想像一只手,手附著在手臂上,手臂附著在身體上?,F(xiàn)在想像你重重地?fù)糁辛松眢w。通常手臂像連迦般抽IK基本上它需要?jiǎng)赢嫀熢O(shè)定每種工作的大量信息--架前面的骨架移動(dòng),那么這塊骨架將移動(dòng)多少百分比,等等。和它現(xiàn)在一樣,盡管很好,它是一個(gè)很大的處理問(wèn)題,不用它你可以有不同的動(dòng)畫組合IK解決辦法需要一個(gè)層次骨骼系統(tǒng)而不是一個(gè)模型空間系統(tǒng)--否則它們都耗時(shí)太多以致無(wú)法恰當(dāng)?shù)赜?jì)算每個(gè)骨架。12/30LOD幾何系統(tǒng)最后,我們應(yīng)當(dāng)快速討論一下與縮放模型幾何復(fù)雜度相關(guān)的細(xì)節(jié)級(jí)別(LOD(與討論MIP映射時(shí)使用的LOD相對(duì)照)PC游戲支持的處理器速度的巨大范圍,以及你可能渲染的任何給定可視場(chǎng)景的動(dòng)態(tài)性質(zhì)(在屏幕上有一個(gè)角色還是12個(gè)?),你通常需要一些系統(tǒng)來(lái)處理這樣的情況,比如,當(dāng)系統(tǒng)接近極限試圖同時(shí)在屏幕上繪制出12個(gè)角色,每個(gè)角色有3,000個(gè)多邊形,并維持現(xiàn)實(shí)的幀速率。LOD被設(shè)計(jì)來(lái)協(xié)助這樣的情景中。最基本的情況,它是在任何給定時(shí)間動(dòng)態(tài)地改變你在屏幕上繪制的角色的多邊形數(shù)量的能力。面對(duì)現(xiàn)實(shí)吧,當(dāng)一個(gè)角色走遠(yuǎn),也許只有十個(gè)屏幕像素高度,你真的不需要3000個(gè)多邊形來(lái)渲染這個(gè)角色--或許300個(gè)就夠了,而且你很難分辨出差別。一些LOD系統(tǒng)將會(huì)需要你建立模型的多個(gè)版本,而且他們將會(huì)依靠模型離觀察者的接近程度來(lái)改變屏幕上的LOD級(jí)別,以及多少個(gè)多邊形正被同時(shí)顯示。更加復(fù)雜的系統(tǒng)實(shí)際上將會(huì)動(dòng)態(tài)地減少屏幕上的多邊形數(shù)量,在任何給定時(shí)間,任何給定的角色,動(dòng)態(tài)地--Messiah和Sacrifice包括了這種風(fēng)格的技術(shù),盡管在CPU方面并不便宜。你必須確信,與首先簡(jiǎn)單地渲染整個(gè)事物相比,你的LOD系統(tǒng)沒(méi)有花較多的時(shí)間計(jì)算出要渲染那些多邊形任一方式都將會(huì)工作,由于如今我們?cè)噲D要在屏幕上繪制的多邊形數(shù)量,這是件非常必要的事情。注意,DX9將會(huì)支持硬件執(zhí)行的自適應(yīng)幾何縮放(tessellation)。歸結(jié)起來(lái)是,得到一個(gè)運(yùn)動(dòng)流暢,其表現(xiàn)和移動(dòng)在視覺(jué)上可信,屏幕上看起來(lái)逼真的模型。流暢的動(dòng)畫時(shí)常是通過(guò)手工建造動(dòng)畫和運(yùn)動(dòng)捕捉動(dòng)畫的組合得到。有時(shí)你僅僅手工建立了一個(gè)給定的動(dòng)畫--當(dāng)你在為一個(gè)模型做一些你在現(xiàn)實(shí)生活中不能做到的事情的動(dòng)畫時(shí),你傾向于這樣做--舉例來(lái)說(shuō),你確實(shí)不能向后彎腰,或像MortalKombat4中的LuiKang那樣在行進(jìn)的腳踏車上踢腿,通常運(yùn)動(dòng)捕捉這時(shí)候就出局了!通常運(yùn)動(dòng)捕捉動(dòng)畫--實(shí)際上視頻捕捉活生生的演員貫穿于你想在屏幕上所看到的動(dòng)畫--實(shí)感的東西能使一款普通游戲看起來(lái)很棒,而且能掩飾許多事情。比如NFLBlitz,屏幕上的模型大約有200個(gè)多邊形。它們?cè)陟o止站立時(shí)看起來(lái)可怕的斑駁,一旦這些模型跑動(dòng)起來(lái)它們就有快速流暢的動(dòng)畫,模型自身的許多丑陋消失了。眼睛容易看見(jiàn)的是'逼真的'動(dòng)畫而不是模型自身的結(jié)構(gòu)。一個(gè)不錯(cuò)的模型設(shè)計(jì)師能夠掩飾大多數(shù)模型缺陷。我希望這些帶給你對(duì)模型和動(dòng)畫問(wèn)題的洞察力。在第五部份中,我們將會(huì)更加深入3D世界的建造,討論一些物理,運(yùn)動(dòng)和效果系統(tǒng)的東西。第5部分:游戲物理學(xué)既然我們已經(jīng)在內(nèi)存中得到了世界的結(jié)構(gòu),我們必須防止我們的角色從里面掉落出去,并處理地板,斜坡,墻壁,門,以及移動(dòng)平臺(tái)。加之,我們必須正確地處理地心引力,速度變化,慣性,和放置在世界里面的其它對(duì)象的碰撞。這被看作是游戲物理學(xué)。而且在我們進(jìn)一步深入討論之前,我想現(xiàn)在就在這里消除一個(gè)神話。任何時(shí)候你在世界中看見(jiàn)物理,或者任何人在一個(gè)復(fù)雜的游戲環(huán)境中宣稱“真實(shí)的物理”,很好,它是BS。超過(guò)80%的建造一個(gè)有效率游戲物理系統(tǒng)的精力花在簡(jiǎn)化用來(lái)處理世界中對(duì)象的真實(shí)方程式上面。甚至那時(shí),你時(shí)常忽略什么是‘真實(shí)的’,并創(chuàng)造一些‘有趣的’東西,畢竟,這是目標(biāo)所在。例如,在QuakeII里面,你能夠立即從0加速到35MPH,并快速停下來(lái)。沒(méi)有摩擦力,而且斜坡不提供真實(shí)斜坡提供的相同類型的重力問(wèn)題。身體沒(méi)有它們應(yīng)該的作用在所有關(guān)節(jié)上的地心引力--你看不見(jiàn)身體像真實(shí)生活中那樣倒在桌子上面或者邊緣--而且地心引力它本身甚至可能是可變的。面對(duì)現(xiàn)實(shí)吧,在真正的世界中,空間中的飛船不像二戰(zhàn)飛行戰(zhàn)斗13/30不像X-Wing中的LukeSkywalker那樣嘯叫。盡管那樣做更加有趣!作為游戲開(kāi)發(fā)者來(lái)說(shuō),無(wú)論我們做什么,我們需要能夠檢測(cè)墻壁,檢測(cè)地板,在世界中–我們決定對(duì)它們進(jìn)一步要做的取決于我們和我們的游戲需要。效果系統(tǒng)如今絕大多數(shù)的游戲引擎建造有某種效果產(chǎn)生器,這允許我們表現(xiàn)出有洞察力的游戲者所以這是我們需要特別關(guān)心的地方。如今我們有很棒的3D顯示卡,我們能夠傳送大量的三角形給它們,而且他們?nèi)匀灰蟾嗟娜切?。并不總是那樣。在HereticII,使用它的可愛(ài)的軟件渲染模式,由于他們漂亮的符咒效果,Raven遇到了相當(dāng)嚴(yán)重的過(guò)度繪制問(wèn)題。回想當(dāng)你在屏幕上繪制相同的像素超過(guò)一次時(shí),過(guò)度繪制就發(fā)生了。當(dāng)你有許多效果正在進(jìn)行,按其性質(zhì)你有許多三角形,多個(gè)三角形可能相互堆疊在彼此上面。結(jié)果是你有許多重復(fù)繪制的像素。加上Alpha,這意味著在重新繪制之前你必須讀取舊像素并和新的像素混合,這會(huì)消耗更多的CPU時(shí)間。HereticII的一些效果能說(shuō)明這點(diǎn),我們?cè)谝粠飳?duì)整個(gè)屏幕重復(fù)繪制了四十遍。很驚訝,是嗎?因此他們?cè)谛Ч到y(tǒng)里面實(shí)現(xiàn)了一個(gè)系統(tǒng)采樣在過(guò)去30幀的幀速率,如果速度開(kāi)始減慢,它就自動(dòng)地縮減任何給定效果繪制的三角形數(shù)量。這樣使主要工作完成了,幀速率保持住了,但一些效果看上去很丑陋。無(wú)論如何,因?yàn)槿缃窠^大多數(shù)效果傾向使用大量很小的粒子模擬火和煙等等,結(jié)果你在效果代碼里面每幀要處理許多的三角形。你必須把它們從一幀移動(dòng)到下一幀,決定它們是否完成了,甚至還要在它們身上運(yùn)用一些物理學(xué)以便讓它們?cè)诘匕迳厦孢m當(dāng)?shù)姆磸?。這在PC上面都是相當(dāng)昂貴的,因此甚至現(xiàn)在你必須對(duì)你所能夠做的有一些實(shí)際限制。舉例來(lái)說(shuō),用一個(gè)像素粒子產(chǎn)生火的效果可能會(huì)很好,但當(dāng)你這么做的時(shí)候就別期望在屏幕上做更多別的事情。粒子被定義為擁有它們自己的世界位置和速度的非常小的可繪制的物體。它們不同于有方向的精靈,大的粒子使用這些精靈--比如噴出的一團(tuán)團(tuán)煙霧。它們面向照相機(jī)自動(dòng)而典型地旋轉(zhuǎn),縮放,改變它們的透明級(jí)別,因此它們能夠隨著時(shí)間淡出。我們?nèi)菀卓吹酱罅康牧W樱覀儏s限制精靈的數(shù)量—盡管兩者之間的真正不同如今正在模糊。將來(lái),特別是在DX9和更加高級(jí)的圖形硬件表面以后,我們可能看到更多的人們使用過(guò)程shader來(lái)產(chǎn)生跟粒子系統(tǒng)相似或者更好的效果,創(chuàng)造非常棒的動(dòng)畫效果。當(dāng)談?wù)撔Ч到y(tǒng)時(shí),你可能聽(tīng)說(shuō)過(guò)‘圖原’這個(gè)詞。一個(gè)圖原是你的效果系統(tǒng)將處理的效果的最低級(jí)別的物理表現(xiàn)。更進(jìn)一步解釋,一個(gè)三角形是一個(gè)圖原。那是絕大多數(shù)引擎最終在底層繪制的--大量的三角形。當(dāng)你沿著系統(tǒng)向上時(shí),你對(duì)圖原的定義隨著變化。比如說(shuō),頂層的游戲程序員不想考慮處理個(gè)別的三角形。他僅僅想說(shuō),"這個(gè)效果在這里發(fā)生"并讓系統(tǒng)以一種黑盒方式處理它。因此對(duì)于他來(lái)說(shuō),一個(gè)效果圖原就是‘讓我們?cè)谑澜绲倪@點(diǎn)持續(xù)這么長(zhǎng)時(shí)間用這樣的引力產(chǎn)生一束粒子’。在效果系統(tǒng)內(nèi)部,它可能認(rèn)為一個(gè)效果圖原是它那時(shí)正在產(chǎn)生的每個(gè)單獨(dú)的效果,像一組遵循同樣的物理學(xué)規(guī)則的三角形—然后它傳送有一點(diǎn)困惑,但你知道總的思想了。以上就是第五部分,下一個(gè)部分是關(guān)于聲音系統(tǒng),和各種不同的音頻APIs,3D音頻效果,處理閉塞和障礙,各種不同材料對(duì)聲音的影響,音頻混合等等。14/30第6部分:聲音系統(tǒng),音頻APIs聲音系統(tǒng)由于人們玩的游戲在種類和技術(shù)上的進(jìn)步,聲音和音樂(lè)近幾年來(lái)在游戲中正逐漸變得重要起來(lái)(聲音是一個(gè)實(shí)際游戲的可玩特點(diǎn),比如在Thief現(xiàn)在四聲道環(huán)繞系統(tǒng)在游戲玩家的寶庫(kù)中是負(fù)擔(dān)得起的和平常的事。給定空間的聲音,噪音的障礙和閉塞,和動(dòng)態(tài)的音樂(lè),如今許多游戲使用這些提高玩家情緒上的反應(yīng),更多的關(guān)注投入到這個(gè)領(lǐng)域就不足為奇了。現(xiàn)在在PC競(jìng)技場(chǎng)中,游戲玩家實(shí)際上只有一種聲音卡可以選擇--PC聲卡制造商創(chuàng)新公司(CreativeLabs)的SoundBlasterLive!從舊的時(shí)間個(gè)人計(jì)算機(jī)聲音卡片制造業(yè)者有創(chuàng)造力的中心.多年來(lái)創(chuàng)新公司已經(jīng)為DirectX提供了他們的EAX是發(fā)起新的OpenAL(開(kāi)放音頻庫(kù)OpenAudioLibrary)的創(chuàng)立者。就如同OpenGL是一個(gè)圖形API一樣,OpenAL,像它起來(lái)聽(tīng)一樣,是一個(gè)聲音系統(tǒng)的API。OpenAL被設(shè)計(jì)為支持大多數(shù)通常聲卡的許多特征,而且在一個(gè)特定的硬件特征不可得時(shí)提供一個(gè)軟件替代。為了更好的定義OpenAL,我向創(chuàng)新公司的GarinHiebert詢問(wèn)了其定義:"這里借用我們的"OpenAL規(guī)格和叁考"的一個(gè)定義:OpenAL是對(duì)音頻硬件的一個(gè)軟件接口,給程序員提供一個(gè)產(chǎn)生高質(zhì)量多通道輸出的能力。OpenAL是在模擬的三維環(huán)境里產(chǎn)生聲音的一種重要方法。它想要跨平臺(tái)并容易使用,在風(fēng)格和規(guī)范上與OpenGL相似。任何已經(jīng)熟悉OpenGL的程序員將發(fā)現(xiàn)OpenAL非常熟悉。OpenALAPI能容易地被擴(kuò)展適應(yīng)插件技術(shù).創(chuàng)新公司已經(jīng)把EAX支持加入到這套API了,程序員可以用來(lái)給他們的聲音環(huán)境增加復(fù)雜的反響,比賽和障礙效果。如同JediKnightII:Outcast一樣,連同Eagle世界/聲音特征編輯器,SoldierofFortuneII以這個(gè)新系統(tǒng)為特征。什么是Eagle?在介紹這個(gè)以前,讓我們討論一些其他的系統(tǒng),并定義一些聲音術(shù)語(yǔ)。另外的一個(gè)系統(tǒng)是Miles聲音系統(tǒng)。Miles是一家公司,它為你的代碼生產(chǎn)插件,在充分利用每塊聲卡時(shí)處理所有必須的到特定聲音卡的說(shuō)話(比如SoundBlasterLive!系列,或者老的A3DAPI前端,捆綁了一些額外的特征在里面。在其他事物當(dāng)中Miles讓你存取一些事物像MP3解壓縮。它是很好的解決方案,但像任何事一樣,它而且他們有段時(shí)間了,因此他們的確精通自己的業(yè)務(wù)。聲音術(shù)語(yǔ)讓我們開(kāi)始障礙和閉塞。它們聽(tīng)起來(lái)一樣,但不是這樣。閉塞基本上意謂著一個(gè)聲音在播放時(shí)聽(tīng)者在他們之間有一些閉合的障礙物。NOLF2的一個(gè)屏幕鏡頭上你聽(tīng)到房子里面壞蛋的聲音。你能聽(tīng)到他們,但是他們的聲音相當(dāng)?shù)统炼硢?。障礙是相似的,但是你和聲音之間的障礙物并不是閉合的。一個(gè)好的例子就是在你和聲源之間有一根柱子。由于房間中的回聲你仍然聽(tīng)得到這個(gè)聲音,但是它和聲音直接傳遞到你的耳朵里是不同的。當(dāng)然這確實(shí)依賴于知道在你的耳朵和聲源之間后面我們將會(huì)談到跟蹤--足可以說(shuō)它時(shí)常是比較慢的幀速率的原因。QuakeIII里面的A3D代碼做了這些事情,關(guān)閉這些選項(xiàng)通常能夠提高幀速率。Tribe2是這種弊病的另外一個(gè)受3D聲音選項(xiàng)則你的幀速率立即好轉(zhuǎn),這在你考慮Tribes世界有多大和你能看見(jiàn)多遠(yuǎn)時(shí)有意義。15/30接著是聲音物質(zhì)的特征。大部分聲卡可以讓你能夠用可定義的過(guò)濾器作用于聲音從而修正播放的聲音。例如,在水下,或者在一個(gè)布料遮蓋的房間中,或者在一個(gè)長(zhǎng)的走廊中,或者在歌劇院,聽(tīng)到的聲音有著很大的不同。能夠根據(jù)你所處的環(huán)境改變你聽(tīng)到聲音的方式是相當(dāng)不錯(cuò)的。我們回到Eagle?這是一個(gè)編輯器,允許多數(shù)第一人稱射擊游戲地圖設(shè)計(jì)者將他們的地圖導(dǎo)入到這個(gè)工具,然后構(gòu)造簡(jiǎn)化的幾何形體來(lái)為實(shí)際游戲引擎中的EAX代碼產(chǎn)生一個(gè)聲音地圖。其思想是你不需要一個(gè)真實(shí)的圖形地圖的復(fù)雜幾何形體來(lái)模擬聲音環(huán)境。你也能夠給產(chǎn)生的簡(jiǎn)化地圖分配聲音物質(zhì),這樣聲音環(huán)境就能夠動(dòng)態(tài)地改變。我親眼目睹了這在SoldierofFortune和UnrealTournament上的示范,確實(shí)相當(dāng)引人注目。我這在財(cái)富和Unreal巡回賽和它的軍人上真的對(duì)示范是證人相當(dāng)醒目.當(dāng)你跳入水中時(shí),聽(tīng)到所有的聲音改變,這是一個(gè)非常令人沉浸的經(jīng)歷。好,讓我們繼續(xù)吧。對(duì)于游戲機(jī),由于靜態(tài)的硬件,你的各種可能性會(huì)更受限制—盡管在PlayStation2和Xbox上,硬件相當(dāng)不錯(cuò)。我說(shuō)的限制,僅僅是指擴(kuò)展,而不是它所能夠做的。我一點(diǎn)也不會(huì)感到驚訝看到這些游戲機(jī)上的游戲很快支持杜比數(shù)字5.1(DolbyDigital5.1)輸出。Xbox,由于它的MCP音頻處理器,能夠?qū)⑷魏斡螒蛞纛l編碼為5.1,并且游戲不需要特別編碼就能利用這個(gè)特征。杜比(Dolby)把ProLogicII帶到了PS2上,并與Factor5合作為GameCube游戲?qū)崿F(xiàn)了ProLogicII。在Xbox之上,Halo,Madden2002和ProjectGothamRacing等游戲都有5.1杜比數(shù)字音頻內(nèi)容。DTS最近也為PS2游戲開(kāi)發(fā)者發(fā)布了SDK,為這個(gè)平臺(tái)上的游戲帶來(lái)了降低了比特率的DTS音頻版本。位置的聲音一個(gè)復(fù)雜的世界現(xiàn)在有一些很少有處理的聲音空間化問(wèn)題。我說(shuō)的是把聲音放在一個(gè)真實(shí)的3D世界中。有四個(gè)揚(yáng)聲器在你周圍是一個(gè)很棒的開(kāi)始,但這仍然只是在二維方向。在你的上方和下方?jīng)]有揚(yáng)聲器,你沒(méi)有真正獲得3D聲音。有一些聲音調(diào)制過(guò)濾器試圖解決這個(gè)問(wèn)題,但實(shí)際上沒(méi)有真實(shí)東西的代替物。當(dāng)然真實(shí)地大多數(shù)游戲多半只是在二維方向上,因此這仍然不是太大的問(wèn)題。實(shí)際上任何聲音系統(tǒng)最重要的特征之一是把聲音混合在一起。根據(jù)你所處的位置,空間中聲音的位置,每個(gè)聲音的音量大小,一旦你決定了實(shí)際上你能夠聽(tīng)到的聲音,然后你必須混合這些聲音。通常聲音卡自己處理這些,這首先是聲音卡存在的主要原因。然而,外面有一些引擎決定首先用軟件做一次‘預(yù)混合’。直到你著眼于一點(diǎn)點(diǎn)歷史以前,這并沒(méi)有真正地帶來(lái)多大的意義。當(dāng)聲音卡最初問(wèn)世的時(shí)候,有許多不同的混合方法。一些聲卡可以混合8單位1632如果你總想聽(tīng)到16種可能的聲音,但你不知道聲音卡是否能夠處理,那么你回到了嘗試和試驗(yàn)的道路上—就是你自己用軟件混合。這實(shí)際上是QuakeIII:"QuakeIII是為A3D和SoundBlasterLive!聲卡世界發(fā)布的,這比以前更加標(biāo)準(zhǔn)化,為什么還這樣做?"這是個(gè)好問(wèn)題。實(shí)際上QuakeIII的聲音系統(tǒng)幾乎每行代碼都和QuakeII中的聲音系統(tǒng)一樣。而且QuakeI,甚至Doom也是這樣。你想一想,向上直到A3D聲卡和SBLive!聲卡,許多年來(lái)聲音系統(tǒng)的需求沒(méi)Doom一直到QuakeIII沒(méi)有發(fā)生太大變化。而且在游戲行業(yè)中,如果不是迫不得已,別理會(huì)它。通常你會(huì)僅僅使用DirectSound為你做聲音混合,因?yàn)樗鼤?huì)可以使用的聲音硬件,或者轉(zhuǎn)而依靠軟件,很多地方就像DirectX為3D顯示卡所做的一樣。在90%靠軟件混合對(duì)你的幀速率沒(méi)有真正發(fā)生太多不同。當(dāng)DirectSound在一些狂熱的編碼者眼中16/30甚至還不是一絲光線時(shí),Doom引擎就已經(jīng)產(chǎn)生了。它從來(lái)沒(méi)有得到更新過(guò),因?yàn)樗鼜膩?lái)就沒(méi)有真的需要更新。SoundBlasterLive:一,一個(gè)足球體育館等。而且你真的應(yīng)該使用由硬件提供的混合器,畢竟,那是它存在的目的。這種方法的一個(gè)不足之處是程序本身時(shí)常無(wú)法獲得混合結(jié)果,因?yàn)榛旌鲜窃诼暱▋?nèi)部完成而不是在主存。如果由于某種原因你需要看到產(chǎn)生的音量,你是運(yùn)氣不好。MusicTracksin(游戲中的音軌)我們沒(méi)有過(guò)多的談到游戲中的音樂(lè)生成。傳統(tǒng)的有兩種方法,一種是簡(jiǎn)單的音樂(lè).wav文件(或同等物)。它被預(yù)先制作做好,準(zhǔn)備運(yùn)行,和最小忙亂。然而,這些在內(nèi)存和回放時(shí)間方面很昂貴。第二種方式用預(yù)設(shè)的樣本編碼MIDI音軌。這時(shí)常比較節(jié)省內(nèi)存,但缺點(diǎn)是必須同時(shí)把一些聲音混合在一起,因而會(huì)把聲音通道用光。動(dòng)態(tài)音樂(lè)就是根據(jù)在游戲中目睹的行動(dòng)改變你的音樂(lè)的能力,比如探險(xiǎn)用慢節(jié)奏的音樂(lè),戰(zhàn)斗用快節(jié)奏的音樂(lè)。預(yù)先制作的音樂(lè)的一個(gè)困難之處是要合拍,因此你可以從一段音樂(lè)漸弱到另一段音樂(lè),這對(duì)于MIDI音軌比較容易。盡管時(shí)常你足夠快速地淡出,或者一段音樂(lè)在播放另一段音樂(lè)之前已經(jīng)消失了,你能僥幸不被察覺(jué)。在我們離開(kāi)這個(gè)主題之前,順便說(shuō)一下,值得一提的是存在一些公司專門為你的游戲創(chuàng)作特定意義的音樂(lè)。FatMan()就是一家這樣的公司。音樂(lè)可能比其他別的東西更加容易外包,這是他們存在的方式。最后,游戲現(xiàn)在的事情自然是MP3格式,允許巨大的11:1的聲音樣本壓縮,然而在送到聲音卡之前只花費(fèi)CPURaveSoftwareStarTrekVoyager:EliteForce中,我們?cè)O(shè)法用MP3在一張CD上面完全支持三種語(yǔ)言,仍然為較多的圖形留有空間。主要地,我們MP3只用于非玩家角色(NPC)的語(yǔ)音,由于游戲的全部音頻效果MP3流和動(dòng)態(tài)解壓縮超出了硬件的處理能力,雖然在將來(lái)這是肯定可能的。比較新的格式,如來(lái)自Dolby的AAC和來(lái)自微軟的WMA,以將近兩倍MP3的壓縮率提供了相等或者更高的音頻質(zhì)量(實(shí)際上一半的比特率),可能應(yīng)用到將來(lái)的游戲中。以上是這一章節(jié)的內(nèi)容,下面將是網(wǎng)絡(luò)和連線游戲環(huán)境的開(kāi)發(fā)。第7部份:網(wǎng)絡(luò)和連線游戲環(huán)境我記得一些年前坐在GDC(游戲開(kāi)發(fā)者大會(huì))聽(tīng)負(fù)責(zé)開(kāi)發(fā)X-WingVsTIEFighter的家伙們題為“淹沒(méi)在Internet”的演講,全是關(guān)于讓網(wǎng)絡(luò)游戲?qū)崟r(shí)地在Internet上工作的東西。他們選擇那個(gè)題目是多么的正確啊。當(dāng)它開(kāi)始處理數(shù)據(jù)包的丟失,亂序,潛伏(一個(gè)數(shù)據(jù)包發(fā)送到它的目的地所花的時(shí)間)等等時(shí),它確實(shí)淹沒(méi)了。然而它是可能的。對(duì)于InternetQuakeIII,UnrealTournament,CounterStrike一直到EverQuest和UltimaOnline。如今大多數(shù)真正有長(zhǎng)久生命力的游戲都至少有一些連線成分。最純粹的單人游戲容易玩如果你想要有任何長(zhǎng)久生命力,那么多人連線游戲就是形勢(shì)的核心所在,并且那意味著和Internet打交道,為編碼者打開(kāi)了那個(gè)潘多拉的盒子。那么跟Internet打交道包括些什么呢?首先是要理解Internet點(diǎn)與客戶機(jī)/服務(wù)器體系結(jié)構(gòu)的快速討論。點(diǎn)對(duì)點(diǎn)就是你在兩臺(tái)機(jī)器上運(yùn)行游戲,并簡(jiǎn)單地在它們之間共享輸入。每個(gè)單獨(dú)的游戲假定它是正確的,并僅僅在它一幀接一幀的刷新中合17/30并來(lái)自另外一臺(tái)機(jī)器的輸入??蛻魴C(jī)/服務(wù)器是一臺(tái)機(jī)器有效地運(yùn)行游戲,別的機(jī)器僅僅是一個(gè)終端,接受來(lái)自玩家的輸入,并渲染服務(wù)器讓它渲染的任何東西??蛻魴C(jī)/服務(wù)器的優(yōu)點(diǎn)是每臺(tái)機(jī)器都將會(huì)展現(xiàn)相同的游戲,因?yàn)樗械奶幚矶荚谝粋€(gè)地方完成,沒(méi)有跨越多臺(tái)機(jī)器,你可以不用考慮每臺(tái)機(jī)器相互之間的同步問(wèn)題。不足之處是,服務(wù)器本身需要有一些重要的CPU可用時(shí)間來(lái)處理每一個(gè)連接的客戶機(jī),和一個(gè)合適的網(wǎng)絡(luò)連接來(lái)確保每一個(gè)客戶機(jī)及時(shí)地接收到它的更新。了解IP我們都已經(jīng)聽(tīng)說(shuō)過(guò)TCP/IP(傳輸控制協(xié)議/網(wǎng)間協(xié)議)和UDP在Web網(wǎng)絡(luò)上有大量關(guān)于這些協(xié)議的深?yuàn)W的技術(shù)資訊。實(shí)際上,在Cisco網(wǎng)站上有一些極好的TCP/IP指導(dǎo)。我們將在較高層面上介紹一些TCP/IP的基本知識(shí),目的是讓你更好地了解使用這些標(biāo)準(zhǔn)協(xié)議的網(wǎng)絡(luò)游戲設(shè)計(jì)者面臨的挑戰(zhàn)。TCP/IP和UDP/IP是兩層的通信協(xié)議系統(tǒng)。IP層負(fù)責(zé)網(wǎng)際數(shù)據(jù)包的傳輸。UDP或者TCP層將大的數(shù)據(jù)包傳給IP,IP將數(shù)據(jù)包分割為小的子數(shù)據(jù)包,為每個(gè)數(shù)據(jù)包加上一個(gè)信封,計(jì)算出目的地的IP地址,應(yīng)該如何到達(dá)那里,然后將數(shù)據(jù)包發(fā)送到你的ISP,或者不管怎樣你連接到網(wǎng)絡(luò)。這實(shí)在象是在一張明信片上寫下你要發(fā)送的,貼上郵票,寫上地址,塞進(jìn)一個(gè)郵箱,它就送走了。UDP和TCP是從你編碼者或者游戲接收數(shù)據(jù)包的高層協(xié)議,并決定該如何處理這些數(shù)據(jù)包。UDP和TCP的區(qū)別在于TCP保證數(shù)據(jù)包的傳送和有序,而UDP不保證。UDP是一條直接和IPTCP是在你和IP之間的一個(gè)接口。它像是在你和你的郵件之間有一個(gè)UDP你會(huì)自己為你的信打字,把它們放進(jìn)一個(gè)信封等等。使用TCP你會(huì)僅僅向你的管理員口授信稿,管理員會(huì)做全部的工作并追蹤確認(rèn)信件送到了。Internet完好無(wú)損地送到了目的方,TCP期待從目的方為它發(fā)送的每個(gè)數(shù)據(jù)包發(fā)回一個(gè)應(yīng)答包(網(wǎng)絡(luò)用語(yǔ)是ACKACK,它就停止發(fā)送任何新的數(shù)據(jù)包,重新發(fā)送丟失的數(shù)據(jù)包,并且將繼續(xù)這樣做直到收到目的方的回應(yīng)。當(dāng)你訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),我們都已經(jīng)看到了這種情形,在半途中下載停止了一會(huì)然后又重新開(kāi)始了。可能是一個(gè)數(shù)據(jù)包在什么ISPTCP要求重新發(fā)送它。這一切的問(wèn)題是,在認(rèn)識(shí)到出了差錯(cuò)的發(fā)送者和實(shí)際上正在送達(dá)的數(shù)據(jù)包之間出現(xiàn)了延遲。有時(shí)這能花上數(shù)秒鐘,如果你僅僅只是下載一個(gè)文件或一個(gè)網(wǎng)頁(yè),這不是什么大礙,但如果這是一個(gè)游戲數(shù)據(jù)包而且每秒至少有十次,那么你真的是遇到麻煩了,尤其是因?yàn)樗V沽似渌磺惺虑?。?shí)際上就是這個(gè)問(wèn)題所以幾乎沒(méi)有游戲選擇使用TCP作為它們主要的Internet協(xié)議,除非它不是一個(gè)實(shí)時(shí)動(dòng)作游戲。大多數(shù)游戲使用UDP--他們不能保證有序或可靠送達(dá),但它確實(shí)很快—或者結(jié)果是至少通常比TCP/IP更快?,F(xiàn)在我們了解這些了,接下來(lái)呢?包大小,智能數(shù)據(jù)傳輸,和反作弊別的必須被處理的事情是數(shù)據(jù)包的大小。如果你在一個(gè)游戲里面64個(gè)人都在跑來(lái)跑去相互攻擊,從一臺(tái)機(jī)器發(fā)送到另外一臺(tái)機(jī)器的數(shù)據(jù)包能變得相當(dāng)大,達(dá)到了一些調(diào)制解調(diào)器沒(méi)有帶寬處理這些數(shù)據(jù)的程度。這正在變得特別和那些有著很大的地表系統(tǒng)的游戲有關(guān)。這里增加的問(wèn)題是,因?yàn)槟阌羞@個(gè)很好的地表系統(tǒng),你能夠看得很遠(yuǎn),因此能夠看見(jiàn)許多其他游戲玩家,使得你為了精確渲染所需要的來(lái)自服務(wù)器的數(shù)據(jù)數(shù)量以很快的速率增長(zhǎng)。我們能做什么呢?好吧,首先必要的是只發(fā)送絕對(duì)必須的東西給任何給定的客戶端,因此他僅僅得到從他18/30的角度觀察游戲所需要的東西。發(fā)送在他視野以外的人們的數(shù)據(jù)沒(méi)有一點(diǎn)意義—他將看不見(jiàn)這些。同時(shí),你最好確保只發(fā)送那些每幀之間實(shí)際上發(fā)生改變的數(shù)據(jù)。如果一個(gè)家伙仍然在播放相同的動(dòng)畫,重新發(fā)送數(shù)據(jù)沒(méi)有意義。當(dāng)然,如果數(shù)據(jù)包丟失時(shí)這確實(shí)帶來(lái)一些問(wèn)題,但這就是為什么好的網(wǎng)絡(luò)程序員被支付很多金錢,來(lái)處理類似這樣的東西。還有一些其他的事情也要處理。最近已經(jīng)有大量的令人苦惱的連線作弊正在發(fā)生。這是某些人修改游戲以給他們不正當(dāng)利益的地方。盡管嚴(yán)格意義上這不是網(wǎng)絡(luò)的一部分,但它確實(shí)發(fā)生了。有時(shí)人們會(huì)創(chuàng)作一些模塊,允許他們立即瞄準(zhǔn)進(jìn)入視野的任何人,或者簡(jiǎn)單地允許他們看穿墻壁,或者讓其他游戲玩家看不見(jiàn)他們自己。大部份時(shí)間這些事情可以在網(wǎng)絡(luò)層內(nèi)部或者在服務(wù)器上被處理。任何有100%命中率的人被簡(jiǎn)單地踢出游戲,因?yàn)樵谌肆λ暗姆秶鷥?nèi)那是不可能的。游戲開(kāi)發(fā)者必須盡一切可能制止作弊行為,但很不幸,人做的東西可以被人突破。所有你能做的就是讓作弊變得困難,當(dāng)確實(shí)發(fā)生時(shí)去嘗試發(fā)現(xiàn)它。8部分中,我們將會(huì)看看游戲腳本系統(tǒng)的趣味世界,根據(jù)游戲過(guò)程中出現(xiàn)的事件來(lái)渲染或使能預(yù)先定義的場(chǎng)景和行為,協(xié)助故事敘述.第8部份:腳本系統(tǒng)腳本系統(tǒng)我們從第七部分的游戲網(wǎng)絡(luò)問(wèn)題來(lái)到了腳本系統(tǒng),因?yàn)槠涑尸F(xiàn)的故事敘述機(jī)會(huì),最近已經(jīng)形成一種很大的游戲元素。在一個(gè)需要以受控制的方式解釋的情景,預(yù)先編制的電影腳本是解決問(wèn)題的方法。在電影中,這通常用來(lái)處理或者由主角向一個(gè)伙伴解釋情形,或者敵人對(duì)英雄解釋。當(dāng)然,有其它的方法來(lái)做這件事情--–但通常是使用實(shí)時(shí)情景的人們和事件來(lái)完成。當(dāng)然,游戲是不同的,游戲開(kāi)發(fā)者在他們平常的FPS中不應(yīng)該做太多的倒敘,因?yàn)橥ǔ?huì)需要載入新的環(huán)境或者關(guān)卡,以及新的紋理和/或模型。所有這些額外的處理和渲染能影響到主要的游戲序列的性能。你可以重用已經(jīng)存儲(chǔ)在內(nèi)存里面的場(chǎng)景元素來(lái)倒敘,但那樣會(huì)看上去明顯比較粗陋。RavenSoft的StarTrekVoyager:EliteForce廣泛利用了腳本序列產(chǎn)生游戲中的事件和使用游戲引擎本身的剪輯場(chǎng)景。在游戲中設(shè)計(jì)腳本情節(jié)的一個(gè)有趣趨勢(shì)是使用當(dāng)前極大改進(jìn)了的3D游戲引擎自己產(chǎn)生剪輯場(chǎng)景。現(xiàn)在這可能像是相當(dāng)?shù)孛黠@,但是數(shù)年以前,當(dāng)3D圖形卡還比較簡(jiǎn)單的時(shí)候,剪輯場(chǎng)景通常使用高端3D3D動(dòng)畫然后被記錄為一個(gè)數(shù)字視頻文件,以流式文件存儲(chǔ)在CD-ROM3D畫面,這是相當(dāng)令人不愉快的失望的事情。但像Half-Life和StarTrekVoyager:EliteForce這樣的游戲很好地利用了它們自己的引擎產(chǎn)生所有的剪輯場(chǎng)景,結(jié)果是剪輯場(chǎng)景和游戲之間的過(guò)渡更加平滑。把腳本和人工智能區(qū)分開(kāi)來(lái)可能是個(gè)很好的主意。腳本是你完全控制著一個(gè)給定場(chǎng)景,建立玩家?guī)缀蹩偸菦](méi)有控制的事件,游戲者‘沿著軌道’移動(dòng)到一個(gè)給定地點(diǎn),或者建立一個(gè)游戲玩家需要解決的情形。一個(gè)好的例子可能是巨石掉在走廊上,需要游戲玩家找到一個(gè)新的逃脫方法。如今有一些不同類型的腳本系統(tǒng)可供程序員或者美術(shù)師使用,而且它用非常有條理和邏輯的思想恰當(dāng)?shù)刈鲞@些。第一種是簡(jiǎn)單的基于文本的,單線索的風(fēng)格,就像我們程序員習(xí)慣Cifthis,thendothat”的東西。大部分腳本傾向在范圍內(nèi)是相當(dāng)線性的—意味著它通常由許多在次19/30序上彼此相接的命令組成。在世界中移動(dòng)角色A指向B移動(dòng)他指向C。相當(dāng)簡(jiǎn)單的事情。然后有復(fù)雜的東西--允許多重線索,和實(shí)際上允許可變情形??勺兦樾问钱?dāng)腳本開(kāi)始時(shí)你實(shí)際上不能確知誰(shuí)會(huì)出現(xiàn)在附近,但是你必須按這樣的方式編寫腳本以便任何人出現(xiàn)在附近它都將會(huì)工作。舉例來(lái)說(shuō)--一個(gè)正常的簡(jiǎn)單腳本會(huì)有三個(gè)家伙,全部被預(yù)先定義,全部有一組他們將會(huì)討論的情形。一個(gè)可變的腳本將會(huì)有三個(gè)人,你不能保證是某一個(gè)特定的人,并必須按相同的方式工作?;蛘咴谝粋€(gè)極端的情形中,也許只有二個(gè),或者甚至一個(gè)家伙將會(huì)在那里,使得三方交談?dòng)幸稽c(diǎn)困難。Raven在StarTrekVoyager:EliteForce中面臨的一個(gè)很大的問(wèn)題是

溫馨提示

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

評(píng)論

0/150

提交評(píng)論