• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            實(shí)時(shí)陰影繪制技術(shù)研究

            C++博客 首頁 新隨筆 聯(lián)系 聚合 管理
              48 Posts :: 20 Stories :: 57 Comments :: 0 Trackbacks

            轉(zhuǎn)載自:http://17de.com/library/HL2/SourceEngine.html

            原文地址:http://17de.com/library/HL2/D3DTutorial10_Half-Life2_Shading.pdf

              在Half-Life 完成之后不久,Valve開始籌備他們的下一個(gè)主打游戲--Half-Life 2。在商討游戲引擎的采用問題上,開發(fā)小組明白到原版游戲所采用的改良Quake 1引擎對(duì)于Half-Life 2來說顯得過于破舊,而且在很多的方面都不符合這一代游戲發(fā)展的要求。于是,vlave的開發(fā)小組決定從美工設(shè)計(jì)以及游戲代碼開始,設(shè)計(jì)出一個(gè)全新的游戲框架,并在其中加入了一套來自havok的定制物理引擎。

              對(duì)于一個(gè)游戲來說,“引擎”就是一個(gè)系統(tǒng),就像是一輛汽車的發(fā)動(dòng)機(jī)一樣,他能輸入來自加速器的動(dòng)能,并輸出到輪子的轉(zhuǎn)動(dòng)。軟件(在這里為游戲)的引擎實(shí)現(xiàn)的東西和汽車的發(fā)動(dòng)機(jī)一樣,輸入來自框架(某些程序或者文件的片段),然后輸出程序員們想要的結(jié)果。再次拿汽車的發(fā)動(dòng)機(jī)為例,一個(gè)軟件的引擎不能自行運(yùn)作,他必須依靠另外一個(gè)系統(tǒng),就好像,你只能開著“一臺(tái)汽車”而非“一臺(tái)發(fā)動(dòng)機(jī)”去上班。在Source中,一個(gè)純粹的引擎只能是一堆代碼,完全不具有可玩性。所以不難對(duì)引擎下這樣的定義:引擎就是一套讓游戲元素發(fā)生互動(dòng)關(guān)系并將其編譯成可玩程序的代碼或程式,依靠框架進(jìn)行操作。



             

            Source引擎總覽

              Source并不是一套簡單的3D引擎,也可以是說,他并非只是一套渲染器。Source引擎包含了很多不同的模組,程序員可以在引擎的程序包中方便地取出以及添加進(jìn)其他的元素。

              在這篇文章里面,我將會(huì)為大家展示這些模組是什么回事并且對(duì)游戲產(chǎn)生怎樣的影響。在下面將要陳述的問題主要講解在Source引擎中一些令人驚奇的模組是怎樣對(duì)整個(gè)游戲的畫面以及游戲效果產(chǎn)生影響,而不是去解釋Source引擎的代碼怎樣去運(yùn)作。對(duì)于此,可能大家會(huì)覺得比較枯燥,畢竟,這些在程序?qū)崿F(xiàn)上的問題針對(duì)的是對(duì)游戲有一定研究的玩家。我們并沒有打算深入到Source的程序代碼進(jìn)行研究,因?yàn)檫@些已經(jīng)不屬于我們一般老百姓可以研究的范疇了。在這里必須要給讀者澄清一下,由于目前Source引擎的非公開性,我們并不能準(zhǔn)確地將Source引擎中每一個(gè)模組的特性都準(zhǔn)確地表示出來,如果你一定要深入研究的話,請(qǐng)參考Half-Life 2發(fā)布之后的 SDK 參考文檔以及Valve以后的白皮書。本文的章節(jié)細(xì)分以筆者對(duì)Source引擎的了解為依據(jù)。請(qǐng)根據(jù)實(shí)際情況印證并參考其他專著以及文獻(xiàn)。

            • 3D 引擎
              • 渲染器
                • Pixel 、vertex shaders
                • 光影效果
                • HDR (High Dynamic Range)
              • 動(dòng)畫以及角色面部表情
              • 幾何構(gòu)成
              • VGUI游戲界面
            • 物理引擎,基于Havok 定制的物理引擎
              • 剛體的動(dòng)力學(xué)模型以及關(guān)節(jié)約束機(jī)制
              • 彈性機(jī)構(gòu)、繩索機(jī)構(gòu)、布紋處理、車輛系統(tǒng)
              • 水以及火光
              • 粒子系統(tǒng)
              • 怪物/NPC/程序 上的物理學(xué)系統(tǒng)
            • 材質(zhì)系統(tǒng)
            • AI 系統(tǒng)


             

            在這里,我尚且用3D engine來描述造Source引擎中,生成引擎輸出圖像及其幾何體的模組。

            渲染器

              這部分最能體現(xiàn)顯卡的功力,也是玩家最為注重的一個(gè)重點(diǎn)。渲染器的作用主要主要功能就是采集畫面幾何體和材質(zhì)的數(shù)據(jù),通過一系列繁雜的過程,生成一個(gè)三維的圖像。Valve并沒有重新創(chuàng)造Source引擎的渲染器而采用了Microsoft DirectX 9.0 的 API,并借助Half-Life SL高階編程語言編寫引擎,在很大程度上節(jié)省了寶貴的時(shí)間,這歸功于 DirectX9良好的硬件兼容性以及先進(jìn)的代碼設(shè)計(jì)流程。原有的Half-Life 1引擎被設(shè)計(jì)成支持 OpenGL and Direct3D的雙模式,但正如各位所見,這個(gè)引擎在Direct3D模式下的渲染十分糟糕,特別是在目前主流的顯卡上工作時(shí),其效率以及畫質(zhì)遠(yuǎn)不及OpenGL模式下的表現(xiàn)。在設(shè)計(jì)Source引擎的時(shí)候,Valve放棄了ogl的渲染模式進(jìn)而采用DirectX架構(gòu),以增強(qiáng)其硬件兼容性以及對(duì)未來特效的支持,比如是Shader2.0b甚至是Shader3.0 Model的支持。

            Pixel and Vertex shaders

              Shader就是一些能夠在GPU/VPU上執(zhí)行的程序句段。目前市面上流行的游戲中,采用實(shí)時(shí)渲染的畫面均大量運(yùn)用了Shader,你的顯卡無時(shí)無刻在處理著這些Shader信息。現(xiàn)代顯卡主要的改進(jìn)就是用Shader代碼替代沿用自GeForce GTS時(shí)代固定的硬件T&L (Transform and Lighting)。Shader允許程序員創(chuàng)建他們喜歡的Shader特效程序片段以取代有限個(gè)數(shù)的固化在顯卡核心中的預(yù)設(shè)特效。經(jīng)過Shader編程之后,如果有一個(gè)關(guān)于bump mapping的技術(shù)推出,程序員只需改寫或者加入該部分的Shader代碼便能使這些特效運(yùn)行在現(xiàn)今的顯卡上,而不需等待下一代的顯卡出現(xiàn)。于是,顯卡的處理特性便得以最大程度地延伸。在程序接口方面,由Microsoft推出的HLSL、nVIDIA推出的Cg、以及OpenGL小組推出的GLSL都是編寫Shader的工具。能和目前個(gè)人PC、工業(yè)用電腦上的DirectX以及OpenGL很好地對(duì)應(yīng)。

              Source對(duì)directx中的pixel/vertex shaders version 2.0提供了完整的支持,Valve最近的聲明指出Source引擎將在未來硬件成熟的時(shí)候提供對(duì)Shader3.0的支持。目前的Source引擎中,所有的directX 9 Shader均在 (high level shader language)下完成,對(duì)代碼的運(yùn)用上只需簡單地插入片段,省卻了在底層使用匯編語言重編譯的麻煩,增加了Source引擎的彈性。在引擎代碼方面,所有的代碼均用C/C++ using Visual Studio 6.0進(jìn)行開發(fā),有很大的開放度以及可擴(kuò)展性,目前已經(jīng)有數(shù)家公司得到Valve授權(quán)采用Source引擎進(jìn)行下一代游戲的開發(fā),除傳統(tǒng)的FPS游戲之外,還有aRPG,SPD等模式,相信在明年開初將會(huì)見到很多采用Source引擎制作的佳作。

              對(duì)于玩家,Shader就能實(shí)現(xiàn)依靠驅(qū)動(dòng)程序?qū)崿F(xiàn)更加多以及更富彈性的特效,在Half-Life 2中最為凸出的Shader2.0特效就是那些吸引眼球的充滿反射和折射的水紋效果。在目前推出的基于Source引擎的CS:Source選項(xiàng)設(shè)置中單獨(dú)對(duì)水紋效果提供了一個(gè)現(xiàn)實(shí)效果設(shè)置選項(xiàng)。

            光影效果:

            在 Source 引擎中使用了兩類的方法處理光影:輻射度光影貼圖和環(huán)境光立方體貼圖。

            • 輻射度光影貼圖主要用于靜態(tài)的大型的物體,比如地形模型。
            • 環(huán)境光立方體貼圖用于動(dòng)態(tài) 的模型或模型庫中可重復(fù)調(diào)用的模型,比如各種游戲中的人物角色、家具陳設(shè)、各種在游戲中可拿起的具有物理特性的物體。

            輻射度光影貼圖

              整個(gè)引擎的光影效果實(shí)現(xiàn)占據(jù)了Source引擎的絕大比重,這里只略略講述Half-Life 2畫面成功的秘訣--輻射度光影貼圖。在 Source 引擎的渲染器中,輻射度光影貼圖扮演著一個(gè)最為重要的角色。先給大家一個(gè)輻射度光影貼圖所能實(shí)現(xiàn)的大概效果:

            方向性光照
            輻射度光照

              在Source以及整個(gè)Half-Life 2架構(gòu)中,光能傳遞貼圖起到的作用就是將光影貼圖和法線貼圖的優(yōu)點(diǎn)有機(jī)地結(jié)合,籠統(tǒng)地說,就是將更加真實(shí)精確的光影效果(輻射度光照)以及更加細(xì)膩的模型細(xì)節(jié)(法線貼圖)通過算法整合到最后的效果圖中。

             

            輻射度法線貼圖基本方程

              在傳統(tǒng)的法線貼圖中,每次工作只會(huì)累積一個(gè)光源的效果,多重漫射光將會(huì)由NL在多通道中進(jìn)行合成,在對(duì)Light Map進(jìn)行輻射度處理的時(shí)候只能處理一個(gè)顏色值。輻射度法線貼圖能在一個(gè)通道中實(shí)現(xiàn)任意多光線的處理,基本處理方程會(huì)轉(zhuǎn)化為每個(gè)切面的向量計(jì)算。在DirectX中,法線是可以轉(zhuǎn)換的,并不局限于形體,可以擴(kuò)展到光線、顏色……。在輻射度貼圖中,使用下面的方程將法線從法線貼圖中轉(zhuǎn)換為上述輻射度法線貼圖基本方程:

            lightmapColor[0]*dot( bumpBasis[0], normal )+lightmapColor[1]*dot( bumpBasis[1], normal )+lightmapColor[2]*dot( bumpBasis[2], normal )

              在3D物體創(chuàng)建上,一般都會(huì)使用cube map制作鏡面反射光線,在Source引擎中,cube map會(huì)在引擎的渲染器中預(yù)先處理,根據(jù)嗅探器的作用,在編輯器中創(chuàng)建的環(huán)境會(huì)選用最近、最貼切的cube map創(chuàng)造反射光線,為解決材質(zhì)的邊界問題,可以手動(dòng)為某個(gè)表面手動(dòng)添加cube map

              在Hammar這個(gè)Half-Life 2地圖編輯器中,設(shè)計(jì)者在材質(zhì)表面安設(shè)了環(huán)境探測(cè)用的實(shí)體以作為鏡面反射的參照物。

              接下來將會(huì)為大家講解在Half-Life 2中整個(gè)靜態(tài)環(huán)境的生成。首先將會(huì)為大家介紹一下我們想得到的效果,并以一個(gè)小范圍為例說明整個(gè)Shader序列的創(chuàng)建過程:

            實(shí)現(xiàn)的效果可以用下面的流程圖進(jìn)行說明:

              左下腳的Normal法線貼圖和三張Lightmap混合后的輻射度貼圖再加上漫反射系數(shù)的控制就可以創(chuàng)建出以上所說的輻射度法線貼圖;再以加法加上傳統(tǒng)的表面光滑度以及反射度的貼圖結(jié)果,就可以生成最終的貼圖效果。在Source中創(chuàng)建一個(gè)靜態(tài)的環(huán)境時(shí)還需要用到三張Lightmap,主要是考慮到為了適應(yīng)任意光源的作用。在下面的分組圖中,大家會(huì)看得更加明白:

            LightMap #1
            LightMap #2
            LightMap #3

             三張直接輻射能貼圖整合之后的效果,由于缺乏了法線貼圖的支撐,整體沒有細(xì)節(jié)可言。

            由于這個(gè)過程處于貼圖的預(yù)處理程序,需要考慮到整體執(zhí)行的效率,因此只采用了分辨率較低的lightmaps貼圖(因?yàn)閐iffuse材質(zhì)的irradiance十分平滑的,只需很小的分辨率,渲染結(jié)果是通過filter還原),在這一步驟中,渲染的貼圖可以說丟失了所有的細(xì)節(jié)。如果盲目增大lightmaps的分辨率,處理時(shí)間會(huì)成倍增加,顯存帶寬也會(huì)被大量占據(jù)。

            因此,Source引擎將lightmaps分成三個(gè)成分,每個(gè)貼圖都有其對(duì)應(yīng)的基本方程,最后根據(jù)法線貼圖儲(chǔ)存的法線進(jìn)行混合得出第一步的處理結(jié)果,在很大程度上利用了低分辨率的好處,并且能將法線貼圖所最擅長的細(xì)節(jié)表達(dá)發(fā)揮出來。

            另一方面,程序設(shè)計(jì)員可以采用不同的法線貼圖與之結(jié)合,在debug模式下實(shí)時(shí)檢查渲染結(jié)果變得比以前方便得多。

            接下來,Source會(huì)將上面由Lightmaps生成的輻射貼圖附上法線貼圖,

            輻射度貼圖
            法線貼圖
            被細(xì)節(jié)化的輻射度貼圖

              物體的表面有凹凸的細(xì)節(jié),形狀方面需要依靠法線貼圖實(shí)現(xiàn),至于光線的表現(xiàn)方面,則需要依靠漫反射系數(shù)來確定。下面的流程就是繼續(xù)細(xì)化并加上法線貼圖的輻射度貼圖。

            輻射度法線貼圖
            漫反射系數(shù)
            被加上漫反射系數(shù)的輻射度法線貼圖

            同時(shí),考慮物體表面反光程度的鏡面反射貼圖也在進(jìn)行之中,第一步也是采用立方體反射貼圖和法線貼圖的混合:

            立方體反射貼圖
            法線貼圖
            法線貼圖加載到鏡面反射貼圖上
            上一步生成的鏡面反射法線貼圖
            鏡面反射系數(shù)
            鏡面反射法線貼圖和鏡面反射系數(shù)的混合

            最后的步驟,由加上了漫反射系數(shù)的輻射度法線貼圖和加上了鏡面反射系數(shù)的鏡面反射貼圖進(jìn)行加法運(yùn)算,得出最后結(jié)果

            加上了漫反射系數(shù)的輻射度法線貼圖
            加上了鏡面反射系數(shù)的鏡面反射貼圖

            最后結(jié)果

            在整個(gè)渲染流程中,法線貼圖起著引導(dǎo)性作用,ATI目前的頂級(jí)產(chǎn)品Radeon X800系列已經(jīng)完整支持新一代的法線貼圖處理方式,并對(duì)大材質(zhì)的貼圖采用了全新的3Dc紋理壓縮技術(shù)。雖然我們目前未收到任何關(guān)于Source引擎采用3Dc紋理壓縮的消息,但從ATI發(fā)布的白皮書來看,X800系列顯卡在處理法線貼圖的算法技術(shù)上會(huì)和Valve有更好的溝通,實(shí)操效果會(huì)占據(jù)一定的優(yōu)勢(shì)。

            環(huán)境光立方體貼圖
             

                《半條命2》動(dòng)態(tài)物件和人物模型的光影效果

                前面介紹了靜態(tài)場(chǎng)景的光影效果,下面我們來看看在《半條命2》中的動(dòng)態(tài)模型是如何繪制的。

                核心技術(shù)-基于環(huán)境光立方體 (Ambient cube)的光能傳遞凹凸貼圖技術(shù)

                由于動(dòng)態(tài)模型的位置和形狀都有可能發(fā)生變化,所以就不能像靜態(tài)場(chǎng)景那樣處理了。動(dòng)態(tài)模型所受到的光照也是由直接光照和間接光照組成的。在Source引擎中,只能從照射一個(gè)模型的所有直接光源中選出有兩個(gè)最主要的來使用比較復(fù)雜的光照公式進(jìn)行實(shí)時(shí)計(jì)算,而其他比較次要的直接光源以及場(chǎng)景中的間接光源都會(huì)被預(yù)先保存到一個(gè)稱為“環(huán)境光立方體”的東西中。

            環(huán)境光立方體

                首先Valve的技術(shù)人員在關(guān)卡場(chǎng)景中放置一個(gè)虛擬的立方體,然后地圖編輯器就分別對(duì)立方體的每個(gè)面計(jì)算出垂直通過這個(gè)面的環(huán)境光的顏色和強(qiáng)度。場(chǎng)景里那些比較次要(遠(yuǎn)或暗)的直接光源,也被計(jì)算在內(nèi)。

                對(duì)于每個(gè)面都計(jì)算一個(gè)光照顏色,可以得到六個(gè)顏色,基本上代表了從四面八方射來的穿過這個(gè)體積中的所有比較次要的光線的信息。這六個(gè)顏色是可以預(yù)先計(jì)算出來保存在關(guān)卡場(chǎng)景數(shù)據(jù)里的。

                通過模型表面的法線來決定取這六個(gè)顏色的比重并將它們混合,就可以得到一種類似于光能傳遞的效果。在環(huán)境光立方體的六個(gè)面中,必然有至少三個(gè)面會(huì)在法線的相反方向,這些面的顏色忽略不計(jì)。所以一般只有另外三個(gè)面的顏色會(huì)用到。法線方向越正對(duì)哪個(gè)面,這個(gè)面對(duì)應(yīng)顏色所占的比重就越大。

                用環(huán)境光立方體技術(shù)渲染的蟻獅模型,雖然沒有加入凹凸貼圖,但是已經(jīng)有一種類似光能傳遞的效果。

            從立方體環(huán)境貼圖中獲取光照的著色器代碼:

            float3 AmbientLight( const float3 worldNormal)
            {

               float3
            nSquared = worldNormal * worldNormal;
               int3
            isNegative = ( worldNormal< 0.0 );
               float3
            linearColor;
               linearColor = nSquared.x * cAmbientCube[isNegative.x] +
                             nSquared.y * cAmbientCube[isNegative.y+2] +
                             nSquared.z * cAmbientCube[isNegative.z+4];

               return
            linearColor;
            }

             
                在前面說道為了結(jié)合使用法線貼圖,對(duì)于靜態(tài)場(chǎng)景,一個(gè)面對(duì)應(yīng)著三張光照貼圖。而在這里也是類似的,一個(gè)動(dòng)態(tài)模型對(duì)應(yīng)著三個(gè)環(huán)境光立方體。這三個(gè)環(huán)境光立方體面上的顏色是分別根據(jù)各面局部坐標(biāo)系的三個(gè)基向量來計(jì)算出來的。

             a.b.c分別使用相對(duì)于三個(gè)基向量的環(huán)境光照?qǐng)D和環(huán)境光立方體的效果

                我們把法線貼圖貼到場(chǎng)景中看一看:

             法線貼圖

                按照和靜態(tài)場(chǎng)景類似的方法用法線貼圖來尋址環(huán)境光立方體的顏色,就可以得到下面的效果了:

                和前面沒有凹凸細(xì)節(jié)的圖對(duì)比一下吧:

                不要忘了,模型本身也是有材質(zhì)貼圖的。我們把它貼上去看一看:

            模型自身的材質(zhì)貼圖,沒有光照

                如果把光照效果和它混合,就成了這個(gè)樣子:

            混合操作依然是顏色各通道相乘。角色表面具有凹凸細(xì)節(jié)。

                和沒有使用法線貼圖的效果對(duì)比一下:

            沒有凹凸貼圖

                漫反射的部分完成后,就該加入高光了。對(duì)于角色的高光,Source引擎仍然使用高光環(huán)境反射貼圖。

            完全的高光環(huán)境反射,也沒有加入凹凸貼圖,好一只光滑的金屬蟻獅

            加了凹凸貼圖

            高光強(qiáng)度貼圖,也是越白的地方高光越強(qiáng),
            我們可以看出蟻獅表面的高光并不是很強(qiáng)的

            用高光強(qiáng)度貼圖去過濾高光

            把高光疊加到漫反射部分上去,得到最后的效果

            折射效果:

            折射效果用于場(chǎng)景中的玻璃或者水面之類的特效。如果我們把場(chǎng)景中的一個(gè)多邊形面所擋住的東西畫到貼圖上,再貼到這個(gè)面上去,那么這個(gè)面看起來就是透明的了。Source 引擎中使用 StretchRect() 從場(chǎng)景渲染后暫存的幀緩存中復(fù)制出一個(gè)紋理,就是我們常說的實(shí)時(shí)渲染到紋理。如果我們?cè)谫N這個(gè)貼圖時(shí)做一個(gè)擾動(dòng),比如加一些水波或者凹凸的擾動(dòng),那么這個(gè)面看起來就像是水面或者凹凸不平的玻璃的折射的效果了。這個(gè)紋理將參照 dudv 凹凸貼圖或法線貼圖在屏幕空間中做適當(dāng)?shù)钠疲缓笤偻渡涞綆缀误w上。借助法線貼圖和最新的DirectX 9.0 Pixel Shader技術(shù),加入這個(gè)擾動(dòng)的過程十分容易實(shí)現(xiàn)。

            部分著色器代碼:

            sampler RefractSampler:          register( s2 );
            sampler NormalSampler:           register( s3 );
            sampler RefractTintSampler:      register( s5 );
            const float3 g_EnvmapTint:       register( c0 );
            const float3 g_RefractTint:      register( c1 );
            const float3 g_EnvmapContrast:   register( c2 );
            const float3 g_EnvmapSaturation: register( c3 );
            const float2 g_RefractScale:     register( c5 );

            struct PS_INPUT
            {
            float2 vBumpTexCoord: TEXCOORD0;
            float3 vWorldVertToEyeVector: TEXCOORD1;
            float3 x3tangentSpaceTranspose: TEXCOORD2;
            float3 vRefractXYW: TEXCOORD5;
            float3 projNormal: TEXCOORD6;
            };

            float4 main( PS_INPUT i ) : COLOR
            {
            // Load normal and expand range
            float4 vNormalSample = tex2D( NormalSampler, i.vBumpTexCoord);
            float3 tangentSpaceNormal= vNormalSample * 2.0 -1.0;
            float3 refractTintColor= 2.0 * g_RefractTint * tex2D( RefractTintSampler, i.vBumpTexCoord);
            // Perform division by W only once
            float ooW= 1.0f / i.vRefractXYW.z;
            // Compute coordinates for sampling refraction
            float2 vRefractTexCoordNoWarp= i.vRefractXYW.xy * ooW;
            float2 vRefractTexCoord= tangentSpaceNormal.xy;
            float scale = vNormalSample.a * g_RefractScale;
            vRefractTexCoord = vRefractTexCoord * scale;
            vRefractTexCoord += vRefractTexCoordNoWarp;
            float3 result = refractTintColor * tex2D( RefractSampler, vRefractTexCoord.xy);
            return float4( result, vNormalSample.a);
            }

            水面的視覺效果:

                首先我們來看反射。Source 引擎首先將水面上要反射的景物上下顛倒地渲染到一張貼圖上。然后是折射,將水下的景物渲染到另一張貼圖上。然后將這兩張貼圖貼到水面的多邊形上,同時(shí)根據(jù)凹凸貼圖,使用 Pixel Shader 對(duì)紋理坐標(biāo)進(jìn)行調(diào)整,以加入擾動(dòng),得到水的最終效果!簡單吧。 然后將這兩張貼圖貼到水面的多邊形上,同時(shí)根據(jù)凹凸貼圖,使用 Pixel Shader 分別加入擾動(dòng),得到水的最終效果!簡單吧。如果沒有DirectX 9.0中的Pixel Shader技術(shù),想對(duì)反射和折射貼圖進(jìn)行象素級(jí)的擾動(dòng)來實(shí)現(xiàn)這樣的水面效果是十分困難的。在Source引擎中對(duì)水面的視覺模擬范例 只采用了30行左右的代碼:

            最終的效果
            反射貼圖
            折射貼圖

            float4 main( PS_INPUT i ) : COLOR
            {
            // Load normal and expand range
            float4 vNormalSample= tex2D( NormalSampler, i.vBumpTexCoord);
            float3 vNormal= vNormalSample * 2.0 -1.0;
            float ooW= 1.0f / i.W; // Perform division by W only once
            float2 vReflectTexCoord, vRefractTexCoord;
            float4 vN; // vectorize the dependent UV calculations (reflect = .xy, refract = .wz)
            vN.xy = vNormal.xy;
            vN.w = vNormal.x;
            vN.z = vNormal.y;
            float4 vDependentTexCoords = vN* vNormalSample.a * g_ReflectRefractScale;
            vDependentTexCoords += ( i.vReflectXY_vRefractYX * ooW);
            vReflectTexCoord = vDependentTexCoords.xy;
            vRefractTexCoord = vDependentTexCoords.wz;
            float4 vReflectColor = tex2D( ReflectSampler, vReflectTexCoord) * vReflectTint; // Sample reflection
            float4 vRefractColor = tex2D( RefractSampler, vRefractTexCoord) * vRefractTint; // and refraction
            float3 vEyeVect= texCUBE( NormalizeSampler, i.vTangentEyeVect) * 2.0 -1.0;
            float fNdotV= saturate( dot( vEyeVect, vNormal) ); // Fresnel term
            float fFresnel= pow( 1.0 - fNdotV, 5 );
            if( g_bReflect && g_bRefract) {
              return lerp( vRefractColor, vReflectColor, fFresnel);
             }
            else if( g_bReflect) {
              return vReflectColor;
             } else if( g_bRefract) {
              return vRefractColor;
             } else{
              return float4( 0.0f, 0.0f, 0.0f, 0.0f );
             }
            }

            HDR (High Dynamic Range)

            以下圖的例子說明:

              如果你有一間只有一角被照亮的,灰暗的房子,那么在這個(gè)角落里的物體旁邊的光線會(huì)比房間其他地方要光。這就是一個(gè)”泛光”的現(xiàn)象。如果你將整個(gè)房間照亮的話,在這個(gè)角落上的物體也會(huì)在視覺上出現(xiàn)高于正常的亮度。在這個(gè)黑暗的房子的頂棚開一個(gè)洞,比如是天窗或者是破舊的穿洞什么的,讓外面的陽光直射進(jìn)屋,這時(shí)在天窗或者孔洞的周圍就會(huì)出現(xiàn)泛光的現(xiàn)象,這一圈的范圍會(huì)出現(xiàn)很多鮮明生動(dòng)的色彩,


             

              這些效果主要是因?yàn)檠劬?huì)對(duì)你看到的亮度作出調(diào)節(jié),虹膜會(huì)不斷地受到周遭光源環(huán)境的影響,而促使瞳孔擴(kuò)張和收縮活動(dòng),眼鏡會(huì)讓瞳孔處在一個(gè)能接受所見景物最高亮度和最低亮度之間的一個(gè)平衡點(diǎn)上,并會(huì)不斷隨環(huán)境變換而作出調(diào)節(jié),視覺區(qū)域中,和這個(gè)平衡點(diǎn)相距甚遠(yuǎn)的色彩區(qū)域則不會(huì)表現(xiàn)該點(diǎn)的細(xì)節(jié),而且會(huì)和背景以及光線在大氣中的折射產(chǎn)生豐富的色彩范圍,于是,泛光的區(qū)域便會(huì)出現(xiàn)。

              在沒有HDR的游戲里面,這些看似很簡單的東西絕對(duì)是不可能發(fā)生。這時(shí)因?yàn)樵谶@些游戲中,每個(gè)像素儲(chǔ)存的只是顏色的信息,或者只是在游戲中會(huì)出現(xiàn)的一些表面、或者網(wǎng)格信息,幾何體被光源照亮的程度只會(huì)由渲染器簡單抬高或者減低像素的色彩亮度以表達(dá)這個(gè)像素是否處在光照環(huán)境,和周圍的環(huán)境是沒有任何聯(lián)系的,真實(shí)的高光以及泛光效果自然不會(huì)被真實(shí)地反映出來。在HDR技術(shù)中,像素被賦予亮度參數(shù),色調(diào)的計(jì)算采用了浮點(diǎn)精度,因此,光源強(qiáng)度不再僅僅限于黑白兩色和燈光顏色的混合,Alpha通道的運(yùn)用豐富了色彩的輸出層次。當(dāng)然,在渲染器引擎中,色彩范圍的增減還是要依 靠像素被照亮的程度來進(jìn)行模擬。目前ATI的8500以上顯卡均已經(jīng)支持浮點(diǎn)著色以及緩沖區(qū)的多對(duì)象著色,nVIDIA的顯卡也已經(jīng)從NV40開始支持該功能,能通過硬件實(shí)現(xiàn) HDR 效果,在游戲中,很多近似于現(xiàn)實(shí)的物理效果能被模擬出來。

            HDR渲染包含多種不同的技術(shù),而Lombardi詳細(xì)透露了Valve對(duì)于LC的計(jì)劃,他們將努力在這一前沿領(lǐng)域再次遠(yuǎn)遠(yuǎn)領(lǐng)先其他開發(fā)者/公司。

            比如,Lombardi提到了Bloom特效:“這一特效已經(jīng)在許多其他游戲中得以應(yīng)用并且往往被誤認(rèn)為是HDR的完全實(shí)現(xiàn)。”

            有趣的是,以下的特效集被Valve描述為“我們?cè)贚ost Coast中對(duì)HDR的定義”,以及“在Source引擎開發(fā)中HDR的初步實(shí)現(xiàn)”,這暗示著我們不但可以期待著在其他基于Source引擎的游戲中看到HDR,而且未來這些HDR特效將會(huì)更多更好。

            以下是目前 Valve 計(jì)劃實(shí)現(xiàn)的HDR特效:

            Bloom:
            用于生成在場(chǎng)景亮處邊緣的“模糊效果”,模仿相機(jī)的曝光過度。


            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡



            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡


            HDR Skybox:
            渲染天空的多次曝光,允許實(shí)時(shí)曝光調(diào)整。對(duì)于LC來說有16種的HDR Skybox變化。

            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡



            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡


            HDR Cube Map(HDR立方體貼圖):
            由引擎生成,使用HDR skybox和HDR light source及HDR light map合力產(chǎn)生。HDR Cube Map讓一個(gè)物體的反射光線更符合光源的亮度。

            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡



            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡

            HDR Water Reflection/Refraction(HDR水反射/折射):
            無論光源的反射有多亮,水面的 “白熱”點(diǎn)總是和Bloom效果一起出現(xiàn)。當(dāng)在水底看著太陽時(shí)可能會(huì)出現(xiàn)類似的效果。

            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡



            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡

            HDR Refraction Effect(HDR折射效果):
            HDR光照穿過可折射材料傳輸時(shí)產(chǎn)生的符合這些材料性質(zhì)的效果(比如陽光照射在LC中修道院的彩色玻璃時(shí)產(chǎn)生絢麗的五彩光芒)。

            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡



            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡


            HDR Light Map(HDR光照貼圖):
            通過radiosity(計(jì)算光線形態(tài)及陰影來生成3D圖象)過程產(chǎn)生,將光彈跳/全局照明也考慮在內(nèi)。我們可以在LC的修道院內(nèi)正對(duì)著窗戶的墻上看到這種特效。

            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡



            半條命2,Lost Coast,HDR,《半條命2》新關(guān)卡


            HDR Light Source(HDR光源):
            未經(jīng)壓縮的光線數(shù)據(jù)值令設(shè)計(jì)人員能夠從任何給定的場(chǎng)景中使用更大范圍的光線數(shù)據(jù)值。

            Exposure Control(曝光控制):
            運(yùn)用“眼睛調(diào)整”令我們?cè)诎挡繄?chǎng)景看到比在過亮場(chǎng)景中更多的不同程度的細(xì)節(jié)。
             

            動(dòng)畫、幾何體以及游戲界面

            動(dòng)畫以及角色面部造型

              就如目前很多的現(xiàn)代游戲引擎一樣,角色的動(dòng)作效果由一個(gè)骨骼系統(tǒng)控制。事實(shí)上,Half-Life 1 是這個(gè)骨骼系統(tǒng)使用的先行者。通過這骨骼系統(tǒng),多種的動(dòng)畫以及細(xì)膩的動(dòng)作可以被綁定到同一個(gè)角色上,由綁定在不同骨架部位的動(dòng)畫互相作用而生成整個(gè)角色的動(dòng)作。Source引擎還在這個(gè)骨架系統(tǒng)中整合進(jìn)Havok先進(jìn)的物理引擎。

              對(duì)于玩家來說,使用附加有物理特性的骨骼系統(tǒng)會(huì)讓我們看到更加真實(shí)的角色動(dòng)作以及怪物的運(yùn)動(dòng)動(dòng)作。因?yàn)樵谶@些骨骼上會(huì)混合地播放角色動(dòng)畫,舉個(gè)例子,一個(gè)角色在跑動(dòng)的時(shí)候向?qū)κ珠_槍,然后被對(duì)手還擊的子彈擊中手部,手中的槍脫手飛出……這一系列的動(dòng)作都能在一個(gè)角色上同時(shí)上演,加入了物理特性的骨骼系統(tǒng)能對(duì)受傷的手部作出反應(yīng),比如是承受沖擊力時(shí)的晃動(dòng)以及身體的扭轉(zhuǎn)。

            面部動(dòng)畫系統(tǒng)

              也許Source中最為神奇的特效來自于引擎中對(duì)面部表情的動(dòng)畫,Valve覺得,Half-Life 2里面的角色應(yīng)該擁有與現(xiàn)實(shí)無異的表情,為了達(dá)到這個(gè)目的,Valve建立了一個(gè)包含面部肌肉模擬系統(tǒng)以及一個(gè)基于文本文件的半自動(dòng)聲音識(shí)別系統(tǒng)。

              在文本識(shí)別系統(tǒng)中,Source采用了“Keyshape”的動(dòng)畫,類似于Valve里面資深動(dòng)畫師Bill Buren所描述的漸變以及頂點(diǎn)動(dòng)畫。這套系統(tǒng)中包含了一系列預(yù)先設(shè)定的表情腳本,能控制角色面肌肉群產(chǎn)生相應(yīng)的面部動(dòng)畫,并進(jìn)行相加/混合/插值運(yùn)算以創(chuàng)建現(xiàn)實(shí)生活中所見的自然真實(shí)的角色表情。

              為了縮短整個(gè)角色動(dòng)畫的構(gòu)建過程,Valve在Source中創(chuàng)建了一套VRS (Voice Recognition Software,聲音識(shí)別軟件),有了準(zhǔn)確自然的角色面部表情,就需要有精密的發(fā)音口形與之搭配,于是,一個(gè)文本文件會(huì)在語音對(duì)話中起到指揮的作用,關(guān)卡的設(shè)計(jì)師只需簡單地將一個(gè)聲效文件以及對(duì)應(yīng)的腳本放進(jìn)Source中,便能讓一個(gè)角色在適當(dāng)?shù)臅r(shí)候說話。所有的角色動(dòng)作會(huì)由VRS作出發(fā)音單詞的判定然后調(diào)用該單詞的口形,這些基本的口型就被稱為Keyshape,通過骨骼系統(tǒng)和頂點(diǎn)漸變過程實(shí)現(xiàn)Keyshape之間的動(dòng)畫,于是便產(chǎn)生了精確的發(fā)音口形。更為神奇的是這些Keyshape能綁定角色的情感因素,Keyshape根據(jù)權(quán)重來確定在面部產(chǎn)生表情的正確部位,Valve將其稱之為面部肌肉的仿真模擬。

            Geometry

              幾何模型的體現(xiàn)主要來自網(wǎng)格(例如表現(xiàn)一個(gè)物體或者角色的整體),靜態(tài)網(wǎng)格(非生成整個(gè)物體),BSP序列以及一些幾何建模實(shí)體。在Source中,所有的幾何體均被儲(chǔ)存在BSP序列中,當(dāng)你查閱該序列的時(shí)候,你可以看到幾何體均在 Hammer 地圖編輯器中的光影關(guān)系,正如上面所說的場(chǎng)景合成一樣,所有的輻射度、漫反射系數(shù)、鏡面反射系數(shù)等均在編輯器中生成。

              BSP序列 (Binary Space Partitioning tree) 用以儲(chǔ)存在Source里面大量的固態(tài)幾何體(或許還有一些非固態(tài)的),不過,關(guān)于BSP序列的創(chuàng)建以及具體的操作將不在本文的討論范圍,各位有興趣的玩家可以在google上搜索有關(guān)地圖制作的知識(shí),特別是關(guān)于Hammar地圖編輯器的使用幫助。

              當(dāng)我提及“mesh”網(wǎng)格的時(shí)候,具體指的是一些將幾何體儲(chǔ)存在地圖文件之外一些獨(dú)立的文件中,Source采用了.mdl文件來儲(chǔ)存mesh網(wǎng)格。mesh多數(shù)用在創(chuàng)建能移動(dòng)的物體或者一些復(fù)合的靜態(tài)物體,主要是因?yàn)檫@種格式的文件能被XSI以及3DMax這些常用作三維建模以及動(dòng)畫設(shè)計(jì)的軟件所導(dǎo)入。此外,.mdl文件還能多次地在場(chǎng)景中出現(xiàn)而避免重復(fù)地將幾何體插進(jìn)地圖文件,采用了.mdl之后,你就不會(huì)再為已經(jīng)夠復(fù)雜的BSP序列添加進(jìn)更多的冗余信息。
             

            VGUI

              值得欣喜的是,Valve的圖形控制界面將在Source中獲得全新的定義。大家都知道,GUI (Graphic User Interface,用戶圖形界面) 就是和命令行(拼命地打字輸入命令)相對(duì)的概念,意味著你根本不需要輸入任何的命令,因?yàn)槟阌行蜗蟮膱D形操作界面能實(shí)現(xiàn)交互的人機(jī)操作。VGUI更是讓開發(fā)者使用Source進(jìn)行GUI的渲染,能在游戲中任何的地方顯示并交互執(zhí)行命令。這時(shí),VGUI已經(jīng)不再只限于一套菜單系統(tǒng),他提供了程序接入窗口、按鈕、彈出窗口、內(nèi)核控制命令行等等控件。所有的這一切能按照程序員甚至玩家的意愿顯示或者放置。另一方面,由于Source的VGUI采用了兼容的Unicode編碼,能很方便地實(shí)現(xiàn)游戲語言以及文字的本地化,在CS:Source中任何地方的中文輸入甚至全世界的語言文字輸入已經(jīng)讓我們見識(shí)到了下一代VGUI的威力。

              在Source中,VGUI能在游戲中以及游戲外面進(jìn)行顯示,Steam的菜單就是一個(gè)很好的例子。在CS:Source出版之前,我們還不清楚,STEAM看似革命性的菜單是否就是采用了全新的VGUI編寫。到了今天,CS:Source正式公開測(cè)試,可以這樣下一個(gè)判斷,CS:S中的,才是真正的VGUI,因?yàn)樗捎昧擞螒虻匿秩疽孢M(jìn)行菜單的潤色渲染,并能通過菜單操作所有的界面命令以及內(nèi)核命令(半透明以及淡出淡入的效果、Debug Option菜單、附著完整信息的Console控制臺(tái)),而Steam的窗口菜單只是GUI菜單的一個(gè)比較完善的改進(jìn)罷了。據(jù)稱,Valve將為Source制定的VGUI命名為VGUI2

            物理系統(tǒng)

              有一樣?xùn)|西是Valve想在Half-Life 2中需要解決的首要問題,那就是一個(gè)能讓角色和場(chǎng)景中任何物體都能發(fā)生互動(dòng)關(guān)系增加整個(gè)游戲可玩性的物理引擎。Valve一直在找這樣一個(gè)引擎,能讓物品能和主角發(fā)生互動(dòng)關(guān)系而不再是一個(gè)擺設(shè),最后,他們將目光定格到 Havok 的物理引擎上。

              當(dāng)和Havok整合之后,Source的一切得到了重生般的感覺,引擎里面所描述的所有東西都有了他們獨(dú)到的物理特性,包括了聲音、外觀、材質(zhì)、AI以及角色動(dòng)畫。當(dāng)Valve被問道,是否會(huì)將Havok 1 引擎升級(jí)到Havok 2 的時(shí)候,Valve指出目前并不會(huì)作出此等舉動(dòng),因?yàn)槎囊娌]有比目前他們所擁有的引擎有更多的性能提升。

            剛體動(dòng)力學(xué) 以及 約束、關(guān)節(jié)鏈

              正如名稱一樣,剛性物體不能在游戲中被打碎、彎曲或者其他形式的扭曲。剛體的動(dòng)力學(xué)是目前游戲中最常見的一個(gè)物理引擎表現(xiàn)部分--僅僅是非形體變形上的物理模仿,通常會(huì)以小盒子、鐵桶、臨時(shí)的木板等形式出現(xiàn),不過有時(shí)候也會(huì)以小玩偶的形式出現(xiàn)(通過關(guān)節(jié)鏈將剛體組成一個(gè)簡單的整體)

              關(guān)節(jié)節(jié)點(diǎn)就是常說的活動(dòng)連接,這種連接允許你將兩個(gè)物體有機(jī)地連接在一齊,你可以為這個(gè)關(guān)節(jié)添加約束,使他們只能在你規(guī)定的范圍之內(nèi)活動(dòng)而不會(huì)走遠(yuǎn)。這就是在游戲中NPC被創(chuàng)建出來的關(guān)鍵。在眾多角色中數(shù)不清的關(guān)節(jié)里面,有一些是能夠被打斷的,而有一些不能,在這些能夠被打斷的關(guān)節(jié)上,在被折斷前就存在著一個(gè)受力的極限值。

              樓房被怪物擊中,整個(gè)墻壁以及上面掛著的招牌被怪物強(qiáng)勁的沖擊波銜翻,在Half-Life 2中似乎到處都充滿這種可以被破壞的墻體。

            柔性體:

              和剛性體相對(duì)的就是柔性以及彈性體,就和Source中的物理特性--作用力與反作用力一致,具體來說就是受力物體對(duì)施力物體的一種反作用,起到兩者的排斥反應(yīng),只不過在彈性力中,這種排斥力是柔和的,加速度相對(duì)較小。在和橡膠輪胎的碰撞中,我們就能體驗(yàn)到這種彈性的反作用力。繩索的定義只需在地圖編輯器中簡單地連接兩點(diǎn)并指定其屬性即可,最重要的一個(gè)屬性就是取樣點(diǎn)的多少。當(dāng)然,取樣點(diǎn)越多繩結(jié)看上去越真實(shí),但會(huì)對(duì)顯示性能造成負(fù)面的影響。布料的模擬就類似于繩索,取樣點(diǎn)點(diǎn)的多少將直接對(duì)布料在物理環(huán)境(大風(fēng)、皺褶等)中的真實(shí)程度。當(dāng)然,布料的模擬將消耗比繩索更加多的CPU資源而且按照目前的3D設(shè)計(jì)來說,要真實(shí)地模擬出一塊布料在各種環(huán)境中的形態(tài)還是未能做到精確。

            車輛系統(tǒng)

              車輛系統(tǒng)在Source中就是物理系統(tǒng)和建模系統(tǒng)的有機(jī)結(jié)合,加入了屬于專有的腳本系統(tǒng)以便能讓玩家操縱車輛。在Source引擎中的車輛系統(tǒng)由另外一群主要的專業(yè)設(shè)計(jì)師擔(dān)任設(shè)計(jì),以在達(dá)到最真實(shí)效果之余在最大限度上節(jié)省創(chuàng)作時(shí)間。畢竟Half-Life 2不是一個(gè)專業(yè)的賽車游戲,玩家只會(huì)用方向鍵對(duì)車輛進(jìn)行操控,因此,在游戲中出現(xiàn)的航船、氣墊船等可操控的交通工具均保持了最高的易用度:和讀者想像中最簡單的操作方法一樣,WSAD控制方向,鼠標(biāo)控制視覺以及槍械的瞄準(zhǔn)。當(dāng)然,車輛擁有屬于自己的一套獨(dú)立的腳本系統(tǒng)。

            水、火

              Source中另外一個(gè)令人迷惑的東西就是水的模擬系統(tǒng)。當(dāng)Valve說,水的效果會(huì)在物理的層面被模擬的時(shí)候,各界均推斷在Source中將會(huì)引入流體動(dòng)力學(xué)并加入物體的浮力特性到其物理指標(biāo)中。但到了后來,Valve在聲明中指出,在Source中并沒有內(nèi)建流體動(dòng)力學(xué)的模型,water區(qū)域只是一個(gè)加入了特別的物理特性的場(chǎng)地。當(dāng)其他的物體進(jìn)入到這個(gè)區(qū)域后,會(huì)作出與之正常行為不同的動(dòng)作,比如是行動(dòng)變得緩慢、并且會(huì)出現(xiàn)重力上的變化(浮力)。當(dāng)然,如果是真正的流體動(dòng)力學(xué)模擬的話,將會(huì)是完全的自身物體特性引起的行為動(dòng)作而非單純的兩者之間的互相作用。

              火,在Source系統(tǒng)中并非一個(gè)獨(dú)立的系統(tǒng),但作為一個(gè)FPS游戲中不可或缺的部分(特別是Half-Life 2這種充滿毀滅性鏡頭的大作),火的效果是最能吸引玩家的眼球的。在Source中,火混合了粒子系統(tǒng)和材質(zhì)系統(tǒng),按照道理來說,在游戲關(guān)卡中的火苗如果在旁邊出現(xiàn)易燃的物體的話,火將會(huì)向這些物體蔓延出去,不過并沒有確切的消息肯定這個(gè)推斷。

            粒子系統(tǒng)和材質(zhì)系統(tǒng)

             

              在Source中,粒子可以理解為“點(diǎn)狀物”,常在一些單面的幾何面上出現(xiàn),這種粒子沒有區(qū)域,沒有體積,只能依靠坐標(biāo)系或者某些參照物來描述其存在的位置,在字面上解,他們就是在空間上的點(diǎn),是Source中比較容易進(jìn)行模擬的物體。Source中的粒子除了長寬高的幾何尺寸和明顯的扭轉(zhuǎn)系統(tǒng)之外,擁有和剛體完全一致的物理特性,畢竟,例子系統(tǒng)并不需要和剛體系統(tǒng)那樣豐富的互動(dòng)性。在游戲中,使用粒子系統(tǒng)創(chuàng)建的最常見的物體就是煙霧、沙塵、火、雨、雪、血霧、火花以及飛濺的碎片。

             

            材質(zhì)系統(tǒng)

              在Source引擎中的材質(zhì)系統(tǒng)被賦予了物理特性以及貼圖外觀的特性。例如,給一塊板賦予木材的材質(zhì),這塊板便具有了木材的所有物理以及外觀特征,重力、韌性、聲學(xué)特性等均被附加到這塊板上。材質(zhì)特性方面保留了諸如密度、表面材質(zhì)、耐壓度、以及當(dāng)折斷或者敲擊時(shí)發(fā)出的聲響,雖然這些在眾人眼中看是一些很簡單很必然的事情,但在游戲中,這些細(xì)節(jié)將會(huì)是游戲增加其感染力的最佳途徑。此外,AI系統(tǒng)還能就材質(zhì)系統(tǒng)提供的信息,反饋給NPC以使其對(duì)戰(zhàn)術(shù)作出相應(yīng)的調(diào)整。當(dāng)然,玩家也可以充分利用材質(zhì)的特性從而得到更多的通關(guān)方法。

            木板被賦予了物理剛節(jié)點(diǎn)之后,破裂之后的斷層不再如一般游戲那樣刀切般平整。

            AI系統(tǒng)

              AI,Artificial Intelligence,近年來在電腦領(lǐng)域是一個(gè)突飛猛進(jìn)的科研領(lǐng)域,一個(gè)優(yōu)秀的AI系統(tǒng),能對(duì)其周圍的環(huán)境智能地作出非線性的反應(yīng)并采取相應(yīng)的行動(dòng)。最重要的是具有依據(jù)周圍環(huán)境參數(shù)的變更而決定系統(tǒng)行動(dòng)的能力,否則,就不能稱之為真正的AI。一個(gè)慣常的AI系統(tǒng),會(huì)使角色根據(jù)當(dāng)前任務(wù)的可行性、對(duì)主要任務(wù)影響的重要性以及目前的周遭環(huán)境作出判斷以選擇達(dá)到預(yù)定目的的最佳途徑,而怎樣選擇最佳的動(dòng)作以達(dá)到這個(gè)目的,就是一個(gè)AI系統(tǒng)優(yōu)秀與否的體現(xiàn)。

            聰明的NPC借助矮墻以及隊(duì)友在對(duì)角線火力的掩護(hù)下弓身前進(jìn)。

              老實(shí)地說句,筆者并不完全明暸Source的AI系統(tǒng)所能夠完成的任務(wù),Valve關(guān)于Half-Life 2的白皮書中就說過很多的東西表明Source里面的AI系統(tǒng)是多么的強(qiáng)大,大意就是下面的幾點(diǎn)(已經(jīng)足夠讓目前每一個(gè)游戲汗顏的了)。
             

            • 允許關(guān)卡設(shè)計(jì)師以I/O接口聯(lián)系游戲中的實(shí)體以控制AI系統(tǒng)。
            • 成熟的導(dǎo)航系統(tǒng),可以實(shí)現(xiàn)角色的跑動(dòng)、飛行、跳躍、下蹲、上樓梯和爬手扶梯甚至在地下的挖掘動(dòng)作。我們?cè)赾z中的機(jī)器人已經(jīng)見識(shí)過新一代的導(dǎo)航系統(tǒng)是如何地高超。
            • AI系統(tǒng)能依靠視覺、聽覺以及嗅覺感知到物體 的存在
            • AI的關(guān)系決定敵友以及其他實(shí)體的關(guān)系
            • 戰(zhàn)斗AI允許AI角色進(jìn)行團(tuán)隊(duì)攻防,他們知道何時(shí)推進(jìn)、何時(shí)撤退、何時(shí)伏倒尋找掩護(hù)等等的戰(zhàn)斗動(dòng)作
            • 如果一個(gè)NPC看到你向一個(gè)關(guān)鍵的物體跑去的時(shí)候,他會(huì)判斷你對(duì)該物體要作出的動(dòng)作而采取相應(yīng)的行動(dòng)
            • 大規(guī)模的NPC進(jìn)攻將一道橋弄垮這些細(xì)節(jié)將會(huì)脫離Valve的劇本隨時(shí)地,在不可預(yù)見的情況下發(fā)生
            • AI知道移動(dòng)重型物體是難以被快速移動(dòng)的。
            • AI能清楚地知道他看到你的最后位置,并會(huì)對(duì)你逃跑的路線作出判斷,以采取相應(yīng)行動(dòng)。
            • NPC會(huì)拒絕執(zhí)行來自玩家的愚蠢的命令
            • AI能使用物理存在的物體。

              在游戲中NPC的AI著實(shí)讓筆者大吃一驚,比如在TrainStation的一幕,主角剛剛到達(dá)City17,被NPC帶到一個(gè)陰暗的長廊上準(zhǔn)備接受洗腦,途中聽到一間房間內(nèi)發(fā)出人類疼苦的哀嚎,好奇的主角把頭湊過去那個(gè)房門上打開的小窗戶想了解里面發(fā)生什么事情,這時(shí),屋內(nèi)的NPC會(huì)判定屋子里面發(fā)生的事情不是主角所應(yīng)該看到的,于是,NPC會(huì)走過來,唰地一聲將小窗戶關(guān)上……類似這種行為判定的例子在游戲中往往會(huì)是通關(guān)的關(guān)鍵。Source引擎做到了主角和NPC之間很好的互動(dòng)以及溝通。

            posted on 2005-12-26 23:51 苦行僧 閱讀(8614) 評(píng)論(8)  編輯 收藏 引用 所屬分類: 轉(zhuǎn)載

            Feedback

            # re: 最牛的游戲引擎之一--Source剖析 2006-01-13 18:36 seraph
            just a reply test,sorry……  回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2006-01-13 18:46 seraph
            原來不注冊(cè)也能回復(fù)。
            hl2游戲還算可以,圖像引擎還真不怎么樣。

            文中還提到valve在hdr相關(guān)方面遠(yuǎn)遠(yuǎn)領(lǐng)先于其他公司,原作者要么是外行,要么是valve的槍手。farcry1.3補(bǔ)丁就加入hdr,而且其效果至今都幾乎是無可超越的,scct也早在3月份就加入了堪稱完美的hdr效果。hl2:lc去年4季度(還是3季度末?)才出,效果也沒見比別人高明到哪兒去,真不知道valve領(lǐng)先到哪兒了。  回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2006-01-16 15:38 苦行僧
            因?yàn)橐郧耙矝]有看過HDR方面的東西,所以看到評(píng)論就google了一下。找到下面兩篇文章:
            http://www.bit-tech.net/gaming/2005/06/14/hl2_hdr_overview/1.html
            中文的翻譯:http://hardware.mydrivers.com/pages/200506241438_43550.htm
            是說valve source的Lost Coast中的HDR的。

            還有一個(gè)就是:http://media.qingdaonews.com/printthread.php?t=17483,我轉(zhuǎn)載了一下,是對(duì)幾個(gè)游戲引擎的HDR效果的一個(gè)圖片對(duì)比。

            看了半天也沒有看明白,HDR比較標(biāo)準(zhǔn)有哪些?怎么說一個(gè)HDR做的比另外一個(gè)好呢?

            因?yàn)槲业姆较蛑饕陉幱斑@邊,沒有研究過HDR,不過跟光照有點(diǎn)關(guān)系的我都比較感興趣,有空多向seraph請(qǐng)教( 也沒有留個(gè)交流方式:( )。  回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2006-02-21 10:41 m17
            驅(qū)動(dòng)之家寫得文章很業(yè)余的啦!
            最近剛照著那份 PDF 自己把所有的 shader 都做了一遍,大概是理解了那些 shader 的原理了. 驅(qū)動(dòng)之家關(guān)于 hdr 的那段寫的不是很好,所以我又改寫了一段,歡迎大家討論  回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2006-02-21 12:40 實(shí)時(shí)陰影繪制技術(shù)研究
            牛人,向你學(xué)習(xí)  回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2006-08-12 19:05 QQ52438974
            的確好牛


            不知道波斯王子1代有沒有上面所說的HDR,BLOOM什么的 但是就畫面來說 的確非常完美

            引擎復(fù)雜程度是一回事
            引擎效率是另一回事


              回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2007-10-18 21:00 test
            <font color=red>test</font>  回復(fù)  更多評(píng)論
              

            # re: 最牛的游戲引擎之一--Source剖析 2012-04-04 22:01 路過
            我暈。。。  回復(fù)  更多評(píng)論
              

            久久综合狠狠综合久久| 伊人久久综合热线大杳蕉下载| 久久国产精品国产自线拍免费| 男女久久久国产一区二区三区 | 品成人欧美大片久久国产欧美 | 久久久久亚洲av成人无码电影| 一本大道久久a久久精品综合| 色偷偷888欧美精品久久久| 激情伊人五月天久久综合| 久久99精品国产麻豆| 日本国产精品久久| 亚洲国产精品人久久| 亚洲国产精品无码久久| 色8久久人人97超碰香蕉987| 久久久久国产一级毛片高清板 | 久久国产一区二区| 亚洲精品蜜桃久久久久久| 久久久亚洲精品蜜桃臀| 亚洲国产天堂久久综合网站| 日韩久久久久久中文人妻| 性做久久久久久久久老女人| 国产激情久久久久影院老熟女| 久久久久97国产精华液好用吗| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 久久国产精品-国产精品| 久久一日本道色综合久久| 国产一区二区久久久| 色偷偷偷久久伊人大杳蕉| 久久er热视频在这里精品| www.久久精品| 久久国产乱子精品免费女| 久久亚洲高清综合| 久久这里只有精品视频99| 久久久久黑人强伦姧人妻| 精品久久久久久99人妻| 久久国产影院| 久久亚洲国产成人精品无码区| 久久夜色精品国产欧美乱| 99久久777色| 成人精品一区二区久久| 一本一本久久a久久综合精品蜜桃|