• <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>

            實時陰影繪制技術研究

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

            轉載自:http://17de.com/library/HL2/SourceEngine.html

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

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

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



             

            Source引擎總覽

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

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

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


             

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

            渲染器

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

            Pixel and Vertex shaders

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

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

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

            光影效果:

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

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

            輻射度光影貼圖

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

            方向性光照
            輻射度光照

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

             

            輻射度法線貼圖基本方程

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

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

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

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

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

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

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

            LightMap #1
            LightMap #2
            LightMap #3

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

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

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

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

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

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

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

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

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

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

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

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

            最后結果

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

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

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

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

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

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

            環(huán)境光立方體

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

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

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

                用環(huán)境光立方體技術渲染的蟻獅模型,雖然沒有加入凹凸貼圖,但是已經(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;
            }

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

             a.b.c分別使用相對于三個基向量的環(huán)境光照圖和環(huán)境光立方體的效果

                我們把法線貼圖貼到場景中看一看:

             法線貼圖

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

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

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

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

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

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

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

            沒有凹凸貼圖

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

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

            加了凹凸貼圖

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

            用高光強度貼圖去過濾高光

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

            折射效果:

            折射效果用于場景中的玻璃或者水面之類的特效。如果我們把場景中的一個多邊形面所擋住的東西畫到貼圖上,再貼到這個面上去,那么這個面看起來就是透明的了。Source 引擎中使用 StretchRect() 從場景渲染后暫存的幀緩存中復制出一個紋理,就是我們常說的實時渲染到紋理。如果我們在貼這個貼圖時做一個擾動,比如加一些水波或者凹凸的擾動,那么這個面看起來就像是水面或者凹凸不平的玻璃的折射的效果了。這個紋理將參照 dudv 凹凸貼圖或法線貼圖在屏幕空間中做適當?shù)钠疲缓笤偻渡涞綆缀误w上。借助法線貼圖和最新的DirectX 9.0 Pixel Shader技術,加入這個擾動的過程十分容易實現(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 引擎首先將水面上要反射的景物上下顛倒地渲染到一張貼圖上。然后是折射,將水下的景物渲染到另一張貼圖上。然后將這兩張貼圖貼到水面的多邊形上,同時根據(jù)凹凸貼圖,使用 Pixel Shader 對紋理坐標進行調(diào)整,以加入擾動,得到水的最終效果!簡單吧。 然后將這兩張貼圖貼到水面的多邊形上,同時根據(jù)凹凸貼圖,使用 Pixel Shader 分別加入擾動,得到水的最終效果!簡單吧。如果沒有DirectX 9.0中的Pixel Shader技術,想對反射和折射貼圖進行象素級的擾動來實現(xiàn)這樣的水面效果是十分困難的。在Source引擎中對水面的視覺模擬范例 只采用了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)

            以下圖的例子說明:

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


             

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

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

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

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

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

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

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


            半條命2,Lost Coast,HDR,《半條命2》新關卡



            半條命2,Lost Coast,HDR,《半條命2》新關卡


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

            半條命2,Lost Coast,HDR,《半條命2》新關卡



            半條命2,Lost Coast,HDR,《半條命2》新關卡


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

            半條命2,Lost Coast,HDR,《半條命2》新關卡



            半條命2,Lost Coast,HDR,《半條命2》新關卡

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

            半條命2,Lost Coast,HDR,《半條命2》新關卡



            半條命2,Lost Coast,HDR,《半條命2》新關卡

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

            半條命2,Lost Coast,HDR,《半條命2》新關卡



            半條命2,Lost Coast,HDR,《半條命2》新關卡


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

            半條命2,Lost Coast,HDR,《半條命2》新關卡



            半條命2,Lost Coast,HDR,《半條命2》新關卡


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

            Exposure Control(曝光控制):
            運用“眼睛調(diào)整”令我們在暗部場景看到比在過亮場景中更多的不同程度的細節(jié)。
             

            動畫、幾何體以及游戲界面

            動畫以及角色面部造型

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

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

            面部動畫系統(tǒng)

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

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

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

            Geometry

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

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

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

            VGUI

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

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

            物理系統(tǒng)

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

              當和Havok整合之后,Source的一切得到了重生般的感覺,引擎里面所描述的所有東西都有了他們獨到的物理特性,包括了聲音、外觀、材質(zhì)、AI以及角色動畫。當Valve被問道,是否會將Havok 1 引擎升級到Havok 2 的時候,Valve指出目前并不會作出此等舉動,因為二代的引擎并沒有比目前他們所擁有的引擎有更多的性能提升。

            剛體動力學 以及 約束、關節(jié)鏈

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

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

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

            柔性體:

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

            車輛系統(tǒng)

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

            水、火

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

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

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

             

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

             

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

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

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

            AI系統(tǒng)

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

            聰明的NPC借助矮墻以及隊友在對角線火力的掩護下弓身前進。

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

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

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

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

            Feedback

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

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

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

            # re: 最牛的游戲引擎之一--Source剖析 2006-01-16 15:38 苦行僧
            因為以前也沒有看過HDR方面的東西,所以看到評論就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的。

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

            看了半天也沒有看明白,HDR比較標準有哪些?怎么說一個HDR做的比另外一個好呢?

            因為我的方向主要在陰影這邊,沒有研究過HDR,不過跟光照有點關系的我都比較感興趣,有空多向seraph請教( 也沒有留個交流方式:( )。  回復  更多評論
              

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

            # re: 最牛的游戲引擎之一--Source剖析 2006-02-21 12:40 實時陰影繪制技術研究
            牛人,向你學習  回復  更多評論
              

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


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

            引擎復雜程度是一回事
            引擎效率是另一回事


              回復  更多評論
              

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

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

            久久久久噜噜噜亚洲熟女综合| 亚洲人成精品久久久久| 99久久精品费精品国产 | 久久久精品无码专区不卡| 久久精品无码一区二区三区免费 | 欧美伊人久久大香线蕉综合69| 一级女性全黄久久生活片免费| 亚洲国产欧美国产综合久久| 狠狠色丁香久久综合婷婷| 欧美色综合久久久久久| 久久99精品久久久久久动态图| 99国内精品久久久久久久| 亚洲精品午夜国产va久久| 久久久久久久综合日本亚洲| 日韩久久久久中文字幕人妻 | 久久久久久久97| 色综合久久久久| 久久天天躁夜夜躁狠狠| segui久久国产精品| 久久精品毛片免费观看| 久久综合亚洲色HEZYO国产| 国产精品99久久免费观看| 2021国内久久精品| 久久精品国产亚洲AV不卡| 久久综合久久久| 国产精品视频久久久| 久久无码人妻一区二区三区午夜| 亚洲国产成人精品女人久久久| 久久精品国产网红主播| 性欧美丰满熟妇XXXX性久久久| 久久毛片免费看一区二区三区| 亚洲国产精久久久久久久| 99久久无色码中文字幕| 久久天天躁狠狠躁夜夜96流白浆 | AAA级久久久精品无码区| 久久99热精品| 久久国产乱子精品免费女| 精品久久香蕉国产线看观看亚洲| 少妇高潮惨叫久久久久久| 国内精品久久久久影院一蜜桃| 久久久久久久久久久久中文字幕|