多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > 探尋次時代渲染 - CryEngine2

探尋次時代渲染 - CryEngine2

來源:程序員人生   發布時間:2016-11-24 08:37:36 閱讀次數:4296次

Advanced Real-Time Rendering in 3D Graphics and Games Course – SIGGRAPH 2007

探訪次時期渲染 - CryEngine2

作者:Martin Mittring

   Crytek 游戲公司

翻譯:潘曦

(譯文里的pancy:XXX)為譯者注)

              (本系列文章由pancy12138編寫,轉載請注明出處:http://blog.csdn.net/pancy12138)

1:來自于獲獎游戲”孤島危機”的1張截圖,它的發布為渲染界開辟了下1個時期。

 

 

2:來自于行將到來的最新的孤島危機的截圖。

 

 

摘要

在這篇文章中,我們其實不具體探討某1種特定的算法。而是嘗試去尋覓德國公司Crytek使用的1些能在1起發揮出更好的效果的渲染算法。(pancy:這篇論文所提到的大部份算法都是以往就提出的,Crytek所做的工作是從眾多的圖形算法中找到最合適使用的算法,將他們經過1些改變,讓他們能夠更容易實現,相互融會并利用于真實的圖形工業當中。這對現代實時渲染技術的發展意義很大

我們認為這些信息對所有希望能夠實現與Crytek公司相似的渲染效果的人員來講都是有用的,由于常常我們在算法實現的時候所遭受到的瓶頸正是在某1渲染效果的基礎上實現1個渲染效果的時候(pancy:也就是我們在同時用多種渲染算法渲染場景的時候,出現的問題和bug也最多),我們同時簡明的介紹了1些你可能會斟酌使用的可以用于替換那些方法的途徑。我們并沒有把圖形方面所做的所有工作完全的進行講授,由于在這篇文章中我們挑選了讀者們所感興趣并且我們能夠拿得出手的領域的拓展技術進行講授。Crytek的開發選取了圖形學社區最近幾年來最具先進意義的理論研究,并且結合了1些新的思想以使得這些先進的理論能夠有效的映照到現今的圖形硬件當中。

介紹

Crytek studios所開發的1個技術出色的第1人稱射擊游戲”孤島危機”在其1經發布便廣受好評,“孤島危機”的出現提高了所有同類型游戲的制作門坎,當我們公司成功開發了“孤島危機I”以后,1個很自然的想法是使用這目前的的引擎來經過很少的改變制作1個它的續作。因此續作會幾近使用在第1作中用到的相同的引擎。固然,這是1個最簡單且獲利最高的決定,但是我們相信這類想法必定會限制我們最初的目標-為游戲賦予更好的技術和藝術。因此我們決定去設計1個全新的次時期渲染引擎并且想法提高新引擎的設計和架構,除新添加的1些特性,新的游戲“孤島危機II”將會繼承1代的游戲風格,不過新的游戲取得各個方面的極大范圍的效果提升。游戲的1切將會變得更加龐大和優秀。而我們所設計的新的游戲引擎 CryEngine2則會讓我們的夢想成真。(pancy:這篇文章的講授重點,盡人皆知的著名次時期引擎CryEngine,introduction寫的簡直英氣沖天)

在我們瀏覽了設計文檔和開過了1個緊張的審議會議以后,我們所有的設計師,程序員,和藝術家達討論出了1組新引擎需要達成的以下目標:

游戲需要包括3種不同的環境:

 

3:叢林中的天堂

具有大量的模型對象,3維高度圖,海洋,廣闊的視野,來自于1個方向光源的環境光。

 

4:外星人的室內場景。

具有許多點光源,整體偏暗,區域劃分,幾何體相互遮擋,體積霧效果

 

5:冰雪環境

冰材料層,地面的次表面散射

完成所有的3個場景是1項極具挑戰性的工作,主要的優化難點在于他們具有完全不同的特點。

1.避免觸發恐怖谷效應的電影級渲染pancy:恐怖谷效應,當虛擬人物的真實程度將要到達真實人類水平而未到達時會出現1個“恐怖谷”此時人類會對這類虛擬人物感到最大的恐懼和厭煩,認真實程度真正到達真實人類水平的時候才會讓人類對其的好感回升):渲染質量越接近視頻質量,則觀眾就需要對游戲投入越少的忍受。

 

 

2.動態光線與陰影:提早算好的光照數據是許多算法提高渲染質量和性能的1個關鍵因素,而由于這些算法常常具有靜態依賴的特性,所以我們不使用這些算法而是使用動態的光影算法。

 

 

3.支持多個GPU與CPU協同工作:多線程加多個圖形卡協作開發是1項很復雜的任務,由于我們大多時候必須要為了更好地協同而犧牲其他的配置。

 

 

4.場景大小需要21km*21km的游戲范圍:我們希望做到這1點,但是終究的生產,流水線,和世界的持久性收益其實不值得我們做這些努力,終究我們實現了多個4km*4km的游戲范圍。

 

 

5.顯卡指令從shader model2.0升級至shader model4.0(Directx10):雖然看上去使用shader model2.0作為開發指令是1個最方便的選擇,但是這類做法會使得我們在directx10下使用最新的圖形卡和圖形驅動進行開發遭到阻礙。

 

 

6.高動態暴光(HDR):我們在“孤島危機I”中使用HDR取得了非常好的效果。為了更真實的視覺效果,我們希望設計的游戲不受低動態的亮度差所限制。

 

 

7.動態環境(可能會被break):這是1項很酷炫的技術,不過非常難以實現。

 

 

8.在開發渲染引擎的時候同時開發游戲:這將迫使我們總是在1些正在使用的狀態中進行編碼,這對1個小型的工程是比較簡單的,但是當工程變得巨大的時候這項工作將變得極具挑戰性。

 

我們的概念藝術家創作了許多概念圖來肯定了游戲最初的雛形。但是為了讓大家感遭到終究的渲染效果,我們通過外包公司 Blur3 studio制作了1份宣揚我們設計理念的視頻。這有助于讓我們到達我們希望到達的外觀和感受。

 

6:Blur3制造的用于為Crysis公司的引擎設計的概念視頻的1幀截圖

概括:

在這篇文章的余下部份,我們會先討論CryEngine2所使用的新的著色框架,這個領域對我們的大范圍場景來講是1個極大的挑戰。以后,我們會介紹我們在實現直接照明與非直接照明效果時所使用的解決方法(包括1些設計思路),我們使用專門的算法將不同的光照從總問題中隔離出來討論,并且用更加先進的方法來解決它。在做完這些處理后,我們先從陰影的角度來處理直接光照(由于陰影在不同復雜度的shader中都可以很輕易的完成)。間接光照我們可以用環境光遮蔽技術來進行摹擬,通過簡單的令光線變暗來代表環境光遮蔽的貢獻。最后,我們涵蓋了各種算法去解決各個層次的細節問題。固然,本篇文章只會包括我們引擎在渲染方面所做的工作,但是這仍然會給予讀者讀我們全部系統的1個不錯的”品味”,并且運行我們在這些選定的領域做足夠深入的發掘。

著色器與著色技術:

1.cryengine1的歷史回顧

“孤島危機I”中,我們支持的最低等級的顯卡裝備是NVIDIA GeForce 2系列。這也意味著我們不但可使用頂點著色器和像素著色器,還能共同支持固定管線T&L函數與寄存器管線(通過提早運行pixel shader解決方案來進行紋理混合)。為了到達這個目標和支持更復雜的材質,我們的Directx和Opengl的shader腳本有了更復雜的規則。在“孤島危機I”以后,我們希望提高前作的質量并且重構之前的系統。首先我們移除所有固定管線的支持,并讓語法更貼近于[Microsoft07]中所描寫的FX語法格式。在項目的晚期,我們為項目加入了1個基于接über-shader的1些新的渲染路徑。這基本上是由1個使用CG或HLSL語言書寫的包括了很多#ifdef的1個pixel shader和1個vertexshader組成的渲染路徑,這使得開發變得簡單而快捷,由于我們完全的避免了手動優化的步驟。初期的shader編譯器還不能夠總是創建出到達人類手工優化的匯編指令,但是在shadermodel2.0的顯卡上已修繕了很多。über-shader渲染路徑的內置變化非常的多,所以將他們1次全部編譯時不可能的,我們在開發進程中發現在編譯的時候有明顯的延遲(當我們不能不編譯shader的時候),但是我們希望能夠在建立游戲的時候具有1個已預編譯好的shader存儲器。我們會在1開始暫停我們的游戲在Nvida或Ati硬件裝備上的運行直到我們的緩存器讀完所有的信息。更多細節可以參考我們的第1款引擎的[Wenzel05]章節。

2.cryengine2

我們決定減少需求的數量以使得新的引擎更加簡潔,因此我們移除opengl的支持和固定管線的支持,這使得我們可以將shder的格式更接近于FX格式,shder的開發和學習也變得更加方便和簡潔(pancy:FX格式是微軟為directx實現的1種shder管理格式,cryengine要想在opengl和固定管線中也是用這類格式是比較困難的,移除這兩個支持極大的統1了shader格式)。我們面臨的另外一個待解決的問題是shder的組合太過龐大,我們重建了全部shader系統,圍棋添加了1個shader需求列表緩沖器。這1列表的數據通過網絡從公司的所有機器上取得,并且我們在夜間對緩存中的shader進行編譯工作。但是編譯時間依然顯得太長了,因此我們決定通過以下操作來減少shader的組合個數。

1.動態分支。

2.減少組合并且接受更少的功能。

3.減少組合并減少1定的性能。

4.多通道分離。

我們通過使用散布式的shader編譯器的屢次迭代,在1個小時內完成了所有shader的編譯。

3.格式法線貼圖

ATI[ARI04]提出的3DcTM紋理格式允許將法線貼圖的每一個像素點通過1個高質量且只有1點點額外shader(重建z緩沖區)的代價緊縮至1個字節,未緊縮的法線貼圖1般使用4個字節來存儲1個像素(法線的xyz存儲在RGB份量中,另外一個字節的份量會被填充并浪費),在我們的新引擎中,我們決定在紋理的加載進程中不做緊縮操作,而是在我們的紋理處理工具中進行處理,在紋理處理工具中為其創建mip levels和緊縮。這類方法使得我們通過簡單的預處理得到了快捷的加載速度。對那些不支持3Dctm的硬件,我們會在加載的時候將這類格式轉化為DXT5格式,這類格式與之前的格式非常的相似因此轉換是很方便的。當視頻質量規格較低的時候紋理轉換帶來的質量上的損失是可以接受的。而且即使是較為古老的NVIDA顯卡的驅動也是有3DcTM紋理摹擬的,所以我們不需要在這個方面做過量的關心(這類摹擬是沒有轉換損失的,相應的代價是每一個像素需要2個字節的存儲空間)。

4.逐像素景深

使用提早的深度緩沖測試可以減少像素著色的代價,由于大部份像素都可以在深度測試的時候被剔除掉,這樣就這些像素就不需要在pixel shader里面被履行。由于我們希望使用更復雜的pixel shader進行像素著色。我們的渲染管線從1開始就使用提早的深度緩沖區測試。如果這樣做的話,我們就需要添加更多的draw call(pancy:我們通常使用的z-test是在 pixel/fragment shader 以后的,如果希望在此之前進行測試則需要先把場景寫入到深度緩沖區1遍,這樣就最少多了1次draw call)。而在很多效果器(pancy: effect是FX格式所定義的單位,包括1整套渲染路徑,此處翻譯為效果器)當中,我們還希望能夠使用到場景的深度信息。這樣我們就需要將深度緩沖區的輸出綁定到紋理資源上以備使用。1開始我們使用R16G16的紋理格式,緣由是這類格式能夠被所有的硬件所支持并且16位的大小也足以實現我們想要的質量。最初我們是使用雙通道的紋理資源但是終究我們優化了這個方法。在ATI的顯卡上,我們使用R16紋理格式以節省1些內存和帶寬的消耗。我們意想到在1些硬件裝備上R16G16格式要比R32格式的速度要慢,所以當顯卡不支持R16格式的時候,我們采取R32格式去替換它。固然,直接訪問深度緩沖區是1種更好的選擇,由于這樣我們不需要額外的內存,提早的深度測試會變得更加快捷(在1些硬件上不寫入色彩到紋理可以提升兩倍的速度)。因此在最后我們根據機器的支持程度來使用R16,R32乃至是默許的深度緩沖區。深度數據被用于在延遲渲染中的1些渲染技能當中(pancy: CryEngine在這篇論文里面所使用到的很多算法都是需要深度重建的,比shadowmap和ssao,這些算法的特點就是通過屏幕空間的深度還原原始的點坐標的3維信息來大大減少算法在像素著色器上的復雜度)。通過1個MAD操作和1個3份量插值機,我們完全有希望根據深度信息重建這個點的原始3維信息。固然,如果需要到達浮點型的精度,還是最好根據攝像機的位置或鄰近點的位置進行3維重建,如果我們在pixel shader里面使用了24位或16位的浮點數據的話,那末這類3維重建的方式就變得很重要了。通過偏移所有的模型對象和光源,我們很容易讓視察者接近坐標原點(0,0,0)。如果不做這個操作的話,貼圖和動畫效果會出現很多跳動和閃爍。我們將景深效果利用于逐像素的場景效果其當中,終究效果和全局霧效,體積霧,和軟深度緩存粒子的效果很相像。

陰影模板的創建也借助場景的深度來減少draw call個數,對水面的摹擬,我們也能夠使用深度數據去柔化水面效果,并沿著海岸逐步增強。1些后處理效果例如運動模糊,景深摹擬和邊沿模糊也一樣會用到各個像素的深度信息。這些算法的細節記錄在[Wenzel07]。

5.世界空間著色

“孤島危機I”當中,我們將視點和光源轉換到了切線空間(根據物體的表面方向),由于所有傳入pixel shader的數據都是定義于切線空間的,所以很自然的著色算法也是在切線空間進行的。而這也使得我們在程序中能夠運行的光照數量受制于shder內部插值器數量的限制。為了解決這1問題,我們決定將著色模型從且切線空間著色轉換成世界空間著色(事實上,我們在運行世界空間著色的時候做了1些偏移以減少浮點類型頂點的精度丟失)。這類著色方法在實現cube map反射算法的時候一樣需要用到。因此著色代碼會變得更加統1和高質量,并且世界空間也不會像切線空間1樣容易扭曲。1些影響因素例如光源的位置可以在pixel shader中設置為常量,這樣就沒必要在所有的模型對象中都進行更新。固然如果我們只是用1個光源或單1的shader進行著色的話,這類做法在額外的像素計算上付出的代價就會顯得比較高。(pancy:這里提到的方法相當于我們現在所說的延遲渲染框架,延遲渲染的好處是剔除所有我們眼睛看不到的頂點使很多個光源的性能大大提升,如果場景只有1個光源的話那就完全喪失了其優勢。)

陰影與環境光遮蔽

1.CryEngine1的陰影摹擬

在我們的第1作“孤島危機I”中,我們使用了shadow map技術根據1個全局太陽光為每一個模型結構構建了1個陽光下的陰影。在當時我們就已遇到了1個典型的shadow map貼圖混淆的質量問題,但是在當時這項技術已是1個最好的選擇了。斟酌到性能方面的問題,我們將植被的陰影做了預先的計算,但是由于內存的限制我們只能使用極為模糊的貼圖來摹擬植被。在高端配置的硬件裝備上,我們乃至為植被也加上了實時的shadow map算法,但是將這些陰影與與計算陰影相互結合的時候依然有很多缺點。對點光源,我們采取了模板陰影算法來計算陰影,而這對點光源來講是簡潔而先進的陰影算法。CPU上的蒙皮操作(pancy:蒙皮操作是指骨骼動畫里根據父子關系存儲的骨骼坐標系對人體或動物的表面頂點進行變換的進程。如今所有的蒙皮操作都是在GPU上進行的,如果在CPU上進行的話不但會拖慢程序的幀率,還會大量消耗CPU)允許我們將陰影輪廓從CPU里抽出,然后在GPU里面渲染模板陰影體。很明顯,這類做法要求我們具有更精致的模型對象,并且需要額外的CPU開消來做蒙皮工作和將蒙皮結果上傳至GPU,同時,我們還得準備更多的內存來存儲輪廓數據。這使得我們幾近沒法預測終究的性能特點(pancy:CPU過度使用將使得性能預測不可用,由于此時有可能CPU成為渲染瓶頸以致于不能根據GPU運算能力和問題范圍預測和優化算法復雜度)。并且,這類做法還會使得我們沒法使用alpha混合和陰影投射技術。這也就意味著這項技術乃至不能用于渲染對熱帶島嶼非常重要的棕櫚樹(圖7)。

 

7:“孤島危機”截屏:注意與計算的陰影與實時計算的陰影柔和的混合在了1起

在開發的進程中,我們希望對所有的室內陰影使用模板陰影體技術,但是,這類技術產生的多光源下的硬陰影的外觀和性能都不能使人滿意,這使得我們希望能尋覓其它的技術來解決室內陰影問題。1個解決方案是將陰影存儲在光照貼圖當中,光照貼圖能夠在不管多少個光源的照耀下保證陰影的柔和性。但是不幸的是光照貼圖存儲的是著色以后的光照結果,這是1個單純的RGB紋理,因此我們沒法在其上面實現法線貼圖。我們解決了這項問題并且為我們的解決方案起名叫做Dot3Lightmaps[Mittring04],在我們的解決方案中,我們在光照貼圖中存儲了1個平均后的切線空間中的光線方向,1個平均后的光照色彩和1個在純潔的環境光和純潔的方向光之間插值以后的混合值。這個操作使得我們能夠很快地計算出各個靜態光源對軟陰影效果的貢獻。但是這類陰影貼圖難以和實時陰影混合,在“孤島危機”發布以后,我們實驗了1種簡單的修改,并為之命名為遮蔽映照(Occlusion maps),這類做法的主要概念是使用1個0⑴的值作為陰影掩碼來代表幾何體對紋理元素的遮蔽概率。我們在光照貼圖當中存儲了來自于多個光源的陰影掩碼并且通常所用的4通道紋理允許1個像素點存儲4個光源的掩碼信息。通過這類方式,我們實現了1種高質量的軟陰影并且成功的計算出了每個漫反射光和鏡面反射光對其的貢獻值,同時,光照的色彩和強度還是可以靈活改變的。我們1直保持所有光源的信息是分開的,這樣才能保證他們和其余類型的陰影完善的融會。

2.CryEngine2的計劃

我們認為是時候統逐一下全部陰影系統了。由于上面提到的1些問題,我們決定放棄模板陰影算法(pancy:shadow voluem就這么沒了deth)。而shadow map總是可以提供高質量的軟陰影并且可以方便的調控性能和質量,因此我們選擇這項技術來實現我們的陰影。但是這項技術只能用于直接光照下的陰影摹擬,而如果沒有斟酌到間接光照的話,我們的游戲就很難到達電影級別的渲染效果。因此,我們計劃使用這個方法來解決直接光照陰影,而使用另外一個方法來解決間接光照陰影。

3.直接光照

對直接光照,我們決定只使用shadowmap技術(將幾何體對象在視野方向的的深度存儲在1個2D紋應當中)而取消所有的模板陰影的使用。

<1>:動態遮蔽貼圖:

為了能夠有效的處理靜態光源的位置,我們希望做1些新的探討。通過對室內幾何體進行1些獨特的展開,shadowmap的查詢結果可以被存儲在遮蔽貼圖中被動態的進行更新。動態遮蔽貼圖的思想史很好的,并且確切起到了1定的作用。但是由于陰影總是會產生混淆毛病,所以現在我們不單單是陰影,連幾何體的展開也出現了混淆。以往用于改良這個問題的紋理拉伸技術有些過于古老了,并且它也不能避免掉所有的紋理拼接縫隙。由于我們仍然需要為動態的物體計算shadowmap,所以我們決定最大程度的加大通用的shadowmap并且下降遮蔽貼圖的大小(pancy:shadowmap算法雖然非常簡潔,但是問題也很多,常見的包括陰影鋸齒(也就是這里提到的混淆效果),陰影瑕疵等等,這是由于shadowmap在1定程度上屬于光柵類算(shadowmap被存儲于紋理并且在使用的時候被反投影來尋覓深度),因此其效果取決于視截體的大小和陰影貼圖的分辨率

<2>:shadow map與屏幕空間隨機紋理查詢:

平面shadow mapping由于混淆現象而變得非常糟并且會產生非常嚴重的鋸齒邊沿(見第1張印象圖)PCF濾波算法(百分比濾波)可以減輕這個問題,但是它需要進行更多的采樣,斟酌到當初的硬件運算水平,這類濾波算法僅僅能夠在NVIDA6代或7代的圖形加速卡上運轉,并且仿真速度被大大的拖慢了。而在更先進的ATI的顯卡上,我們可使用Fetch4函數(在[Isidoro06]中定義)。為了代替使用更多的采樣實現PCF算法,我們還設計了1種隨機像素查找的方法以減少采樣數量來到達相似的陰影效果。固然,這會帶來1點圖象的噪聲,噪聲(或躁點)在任何影視圖象上都會有,所以我們可以根據采樣數量來靈活的控制和調劑運算性能和質量。我們的靈感來源于光線追蹤的軟陰影算法。并且這項算法已利用于GPU上的shadowmap創建。(具體的提升和優化shadowmap質量的細節請瀏覽[Uralsky05]與[Isidoro06])

盤狀散布的隨機偏移可以被利用于2D紋理的查詢。當我們使用1個較大的偏移量的時候,平坦的表面的陰影渲染質量將會由于其表面被隨機紋理肯定的方向而提高,1個3D的圖形例如說球體將會消耗更多的渲染資源,但他應歸屬于偏移的柔化問題。

如果想要得到沒有太多噪聲的可接受結果,我們就需要更多的對陰影圖進行采樣。因此,采樣次數與隨機算法就能夠根據需求的質量和效力不同來進行選擇。我們嘗試使用了兩種方法產生圓盤狀隨機點,1個是對各粒子進行隨機的進行旋轉[Isidoro06],另外一個是使用1個簡單的像素著色器。

 

8:不同質量的shadowmap樣例:從左至右順次是,無PCF,PCF,8次采樣,8次采樣加blur,PCF加8次采樣,PCF加8次采樣加blur。

第1種技術需要1個靜態的2D隨機點和1個存儲著隨機2維旋轉矩陣的紋理。榮幸的是2位旋轉矩陣比較小(2*2)可以被存儲在4通道的紋理中,由于矩陣是正交的,所以還能夠進行進1步的緊縮,但這不是必須的。負數的話可以用經常使用的“放縮偏移”方法進行轉化(乘2減1)(pancy:x= x*2⑴可以將[0,1]轉換到[⑴,1],由于通常的紋理只能存儲0⑵55,因此shader中得到的色彩也是0⑴)或使用浮點紋理來存儲(浮點紋理格式,不用0⑵55存儲色彩而使用float存儲色彩,最新的顯卡都加入了這類擴大以方便的實現shadowmap,ssao,hdr等算法)。我們嘗試了很多種不同的采樣表,并且在圖8中你可以看到利用這些采樣來摹擬軟陰影的效果是不錯的。對1個圓形的隨機盤狀數據或許你希望將其完全填充,但是我們并沒有填充其里臉部分的數據由于他們對采樣來講很少被用到。這類算法效果的瑕疵已很難被發覺了,但是為了更正確的結果,我們仍希望在算法上做1些改進。

1個更簡單的獲得采樣點的方法是將1個或兩個2D紋理上的隨機正采樣點進行簡單的變換。第1個點可以放在中間(mx,my)然后其他的4個點將根據隨機向量(x,y)放在中心點的周圍:

(mx,   my)

(mx + x,my+y)

(mx - y ,my+x)

(mx - x ,my -y)

(mx + y,my -x)

這類做法使得我們可以構造出更多的采樣點,固然我們發現這類做法只是能夠提升那些低端顯卡的材質渲染的速度(由于只有在低端顯卡上我們才需要斟酌限制采樣個數)。

這兩種方法都允許我們調劑采樣點的大小來實現軟陰影。為了得到正確的結果,這個點的大小取決于投影距離和光照半徑,固然這通常都是很容易近似計算的,最初我們采取64*64的紋理來1:1的映照屏幕像素(圖9)。

                                     

                          9:1個隨機采樣點紋理樣例。

這個隨機紋理是經過精心制作以體現其隨機性:在很高維度上都不可辨認出其特點細節。創建1個隨機紋理圖是最直接的方法,我們還可以手動生成1張特點易于辨認的紋理然后我們就可以夠通過1個簡易的算法來尋覓1些可以用于交換的相鄰點,1個好的交換方式可以提高紋理的隨機性頻率(這個計算結果來自于對差異值的總結搜集(pancy:大概是用類似于我們計算方差的方法來判斷紋理的隨機程度如何))。固然,直接創建1張高隨機頻率的隨機紋理是1個更好的選擇。我們描寫這個方法是由于這項技術更合適我們的目的。

 

影視級的效果其實不意味著我們要實現靜態的效果,所以我們有可能將噪點進行運動并且希望這么做能夠在采樣率比較低的時候借助運動來隱藏這些噪點。不幸的是我們終究得到的結果就像是1個新的工藝品1般,幀率變得很低而且不穩定。那些沒有動畫的靜態場景的噪點還能夠差能人意,而隨著攝像機的運動,1些隨機紋理的靜態特點所釀成的噪聲開始出現在屏幕上。

<3>:shadow map與光照空間隨機紋理查詢:

榮幸的是我們找到了1個很好的辦法來解決這個問題,我們在世界空間的太陽光照方向上創建了1個mip-map映照的噪聲紋理以代替之前的屏幕空間噪聲紋理,在中遠距離上的渲染結果與之前是相似的,但是由于使用的雙線性插值所以近處的陰影邊沿變得扭曲而不再有噪聲點了。這個視覺效果看上去比之前強了很多,特別是植物和植被,那些很難描寫具體陰影形狀的模型。

<4>:陰影掩碼紋理:

我們將陰影的查找從我們的渲染管線中分離了出來,這樣就能夠避免遭到shader mode2.0的最大指令數的限制,減少shder的組合個數和允許多個陰影進行混合。我們通過查詢平鋪空間紋理取得了1個8位的陰影貼圖,并稱之為“陰影掩碼”由于1張普通的紋理有4個通道32位作為渲染目標,所以1張4通道的紋理可以將4個燈光的陰影掩碼存儲在1個像素點里。

 

 

10:1個使用隨機查找的陰影樣例。左上:沒有抖動,1次采樣。右上:屏幕空間噪聲,8次采樣。左下:世界空間噪聲,8次采樣。右下:世界空間噪聲,調劑后的8次采樣


11:1個給定場景的陰影掩碼紋理樣例:左圖:通過1個太陽光(視作1個陰影投射)和兩個陰影投射光源。右圖:來自于3個光源的陰影模板紋理的RGB顯示

 

12:1個給定場景的陰影掩碼紋理的樣例,RGB通道代表3個獨立光源的陰影掩碼。

在渲染管線中,我們將這個紋理進行綁定并且立即根據這個紋理渲染出所有的光照和環境光效果。固然,我們除RGB通道外,還可以將幀緩沖區的alpha通道1并使用,但是這樣我們就需要更多的pass(pancy:每一個渲染算法的1趟渲染稱為1個pass,1般高級的殊效都是經過好幾個pass共同渲染的結果)和draw call(pancy:每次調用圖形api的draw操作稱為1次draw call,在當年drawcall的數量會極大的影響程序的效力,因此1般都會嚴格控制到幾百個左右,不過最新的硬件和api已在這個問題上做了很大的修繕,Directx12乃至宣稱10萬drawcall都不會影響到渲染效力)。對不透明的物體和僅僅需要alpha測試的物體(pancy:與alpha混合不同,alpha測試是直接扣除alpha通道不符合要求的像素點,1般來講如果1個點只需要alpha測試意味著這個點不屬于需要進行半透明混合的點,多半是全透明或用于某些算法的預計算)陰影模板可以得到非常好的效果,但是對那些需要進行alpha混合的幾何體來講這類算法起不到任何作用(pancy:現今流行的大部份屏幕空間的算法呢最大的問題就是很難處理半透明物體,像延遲渲染等都有這個問題,1旦物體需要進行alpha混合則這些算法就很難起到作用)。所有的不透明物體都可以被記錄在深度緩沖區當中,但是需要進行alpha混合的點是不能夠記錄在深度緩存區當中的。因此,我們需要在著色器中為半透明的物體建立1張陰影法線貼圖索引。

4.直接光照下的陰影貼圖

“孤島危機I”當中,我們僅僅使用了很少的陰影投射對象,并且每一個被投射的對象都有1個獨立的shadowmap。當陰影投射的對象變得更多的時候,我們認為應當將這些陰影數據統1到1個shadowmap當中。在光照方向使用1個簡單的平行投影就能夠能夠輕易的得到1個shadow

Map,但是這樣會使得靠近視察者的陰影貼圖分辨率非常的低,出現塊狀的陰影。如果我們更改參數,例如生成1個透視投影矩陣將靠近視察者的陰影貼圖分辨率提升。但這也會出現1些問題。我們還嘗試了梯形shadow map(TSM)([MT04])和透視shadowmap(PSM)([SD02])。

我們在使用級聯shadowmap(CSM)的時候獲得了較大的成功,這類算法通過對視野所在區域進行屢次投影得到了許多張不同范圍的相同分辨率的shadowmap。每個投影的影象像素范圍都包括于他前面的那個(pancy:更大的)投影所在的世界范圍的像素區域內。這項技術得到了較好的結果,但是同時也浪費了1些紋理存儲空間,主要是由于這些投影結果只是粗略的包括到了視察者前面的1些區域。為了找到適合的可劃分的視截體(隨著陰影區域大小的必須距離的減少而減少),每個shadowmap都需要包括1個劃分,劃分越遠則視截體就能夠包括越大的世界空間,當1個shadowmap視截體恰好完全的包括1個劃分的時候,比他更小的shadowmap就應當被舍棄掉。如果使用以往的技術,我們已知道當攝像機進行旋轉和平移的時候會出現陰影混淆。而在使用PSM和TSM的時候我們也沒能解決這個問題,但是我們使用CSM加上我們的1些改進則解決了這個問題。我們只是更改了每一個shadowmap像素的投影方式就得到了1個非常清晰的陰影結果。

5.延遲陰影模板的建立

初始化陰影模板的創建需要渲染所有的可見幾何體,這將會使用到更多的draw call。我們使用延遲技術將陰影模板的額建立從幾何體渲染中分離了出來。我們先根據我們用提早z緩沖渲染的深度紋理進行1次全屏渲染pass,這次渲染使用1個簡單的像素著色器(根據深度數據獲得shadow map查詢結果)。并且此次渲染不需要各個點在世界空間的坐標。正如前面所說的,我們使用了多張shadow map,這使得我們用于創建陰影掩碼的著色器需要定義所有的像素點,以肯定每一個像素的陰影映照到了正確的紋理。為每個紋理添加索引可使用directx10的紋理數組功能或在1個大的紋理資源中進行偏移尋址。通過使用模板緩沖區,我們能夠單獨處理各個劃分并且簡化了像素著色器。修改后的技術運行速度變得更快了,由于像素著色器不需要再做復雜的操作。并且算法還屏蔽了那些不需要計算陰影的離視點較遠的場景。

6.展開點光源的shadow map

通常點光源的shadow map都需要1張cube map貼圖來進行深度索引。但是硬件PCF優化其實不能利用于cube map類型的紋理上面,由于這類紋理很難控制和管理其所占的存儲空間。我們將cube map通過在模板緩存上的6次采樣展開成6張陰影紋理貼圖,這與我們在CSM中所做的操作很相似。這樣我們就將點光源類型的陰影問題轉換成了聚光燈類型的陰影問題。這使得代碼更加的統1和易于保護并且減少了shader的組合。

7.方差shadow map算法(VSM)

對地形,我們最初希望先提早算好紋理的起始和結束角度,并且還試圖實時的更新1張遮蔽映照紋理的增量。但是地形上的1些幾何體總是出現1些問題。對那些大的物體,在不同的地形中需要適應不同的陰影。我們嘗試使用我們的法線陰影貼圖技術,這項技術統1了陰影外觀,但是卻致使了陰影的柔和度不足。我們還嘗試使用更大范圍的簡單隨機紋理進行索引,但是這使得噪聲變得更加嚴重。在這里我們嘗試使用方差shadowmap技術[DL06],而這項技術的終究效果非常的不錯。當多個陰影貼圖相互遮蓋的時候方差陰影貼圖的缺點就很明顯了。但是對地形模型來講這類情況是很少產生的。

 

 

13:使用VSM渲染場景的1個樣例。上圖:未使用方差陰影貼圖(注意有硬法線陰影)。下圖:使用了方差陰影貼圖(注意兩種陰影的結合)。

間接光照

1.3D Transport Sampler

在第1部份我們已計劃設計1個叫做“3D transport sampler”的工具,這個工具可以將全局的光照數據分配到多個機器上(斟酌到性能緣由)。

光子映照([jensen01])是1種被大家所認可的計算全局光照的不錯的方法。我們決定采取這類方法摹擬全局光照,由于它可以簡便的統1到系統中,并且快速的得到較好的效果。

 

14:1個光源的實時環境光。

光子映照最早被利用于創建1個簡單的光照映照。這項技術在我們過去的光線映照中實現的很簡單,并且僅僅將相鄰的3角形連接起來并只使用了1個簡單的平面方程。這致使我們填充到多重紋理中的結果出現了很多2D的小塊。同時當我們將算法用于更加精細的模型的時候紋理的使用效力開始顯得很低,并且在紋理的邊界拓展的時候出現了很多細小的中斷(pancy:wrap,紋理拓展,1般來講紋理采樣UV的范圍是[0,1],如果模型的UV超過了這個值就需要進行紋理拓展,具體的拓展方式根據利用而定,常見的有重復尋址和最外邊尋址等)。因此我們更改了紋理的拓展方式,使用模型的紋理拓展UV作為基礎并且只在我們需要的地方做拓展定義。這樣的話負責美工的藝術家就能夠對精細的模型的技術細節做更多且更適合的操控和修繕。我們本想將結果存儲在Dot3lightmaps(前面已做過介紹)但是我們希望嘗試用更好的方式來提升渲染質量。這個方法的主要思路是存儲4個方向的光對表面的貢獻。類似的技術曾被用于“半條命II”(pancy:CS吧??)但是他們只存儲了3個方向的光。明顯更多的數據將會帶來更好的渲染效果。這些數據運行我們進行高質量的逐像素渲染,并且如果不追究細節的話可以和實時陰影較好的結合。但是,由于巨大的存儲量和緩慢的運算速度,我們終究還是放棄了這類方式。其實我們最初的想法只是存儲每一個像素的光照貼圖系數和其余的每一個頂點的信息。將這些信息結合存儲頂點連接關系的圖形數據結構,我們好似有可能實現動態間接光照的。低頻的光照份量可以存儲在各個頂點結構中,高頻的份量例如鋒利的角落等可以存儲在屏幕空間像素當(pancy:頂點結構數量與幾何體有關,屏幕空間像素數量與光柵化有關,看開頭還以為cryengine想挑戰人類極限加入光子映照......結果居然是放棄了...棄了.....了)。由于開發時間是很珍貴的,所以我們終究還是放棄了這個想法。

2.實時環境光映照(RAM)

作為替換,我們選擇了1個更簡單的解決方案,只需要為每一個像素存儲1個環境光遮擋值標量。

環境光遮蔽值([ZIK98,Landis02])可以根據各個方向的發射光線來進行計算。這些光線有些是光子映照中沒有使用到的。我們在著色器中使用這些必要的信息進行重建:存儲了遮蔽值的像素,與表面方向相干的光源位置,光照色彩及表面法向量。我們終究得到了1個粗略的近似環境光,但是人眼對環境光其實不是很敏感,所以終究效果還是不錯的。為了能支持法線貼圖技術,我們需要對光照方向進行平均化,由于我們沒法取得能較好的和法線貼圖表面配合的光照方向。即使使用這類方法,法線貼圖仍然能夠被發覺到,而著色效果也很大的依賴于光照角度。因此我們讓環境光的亮度,色彩和衰減系數都是可以調控的以便設計人員設計出更好的終究外觀。當斟酌到入口效果的時候,這項技術可以進行擴大以使得太陽光可以混合多個其他光線。對更大的室外環境,為每一個表面計算1個RAM是不可行的,因此我們決定使用其他的技術。

3.屏幕空間環境光遮蔽(SSAO)

我們的1個很有創意的程序員想出了1個不錯的方法。這類方法使用我們之前已計算出來的z緩沖數據來計算出1種環境光遮蔽。(pancy:我就想知道那個有創意的程序員叫啥名字......1個不謹慎成了SSAO之父啊!1個不謹慎推動了實時渲染的改革.....)這個方法非常的誘人,由于所有的不透明對象都可以在沒有特殊處理的情況下得到環境光遮蔽,并且不需要額外的內存開消。同時,很多渲染部份的的復雜處理也都可以順手移除。雖然我們現有的解決方案已工作的不錯了,但是我們還是希望能夠計算出所有種類的動態環境光。這類方法基于屏幕像素與采樣像素進行簡單的深度比較在物體的周圍得到1個由遮蔽因子決定的輪廓。而這類環境光遮蔽的效果僅僅決定于這個點對周圍光線的的接收程度。經過量次的迭代和優化,我們得到了1種意想不到的效果,我們將其稱為“屏幕空間環境光遮蔽”(SSAO)。我們通過1次對全屏幕像素履行的pass來計算環境光遮蔽效果。我們還嘗試將這類效果同時利用于環境光,漫反射和鏡面反射,但是終究發現他只是對環境光摹擬效果最好。最大的緣由多是這類算法使得渲染的真實化遭到了影響,這也是我們未來的優化目標。

為了減少采樣次數我們將采樣點跟改成像素附近點的采樣,初始的樣本散布于1個以源點為中心的球體表面。然后通過1個隨機的3D平面將這些采樣點反射到隨機的采樣位置。

                    n:來自于紋理的歸1化的隨機像素向量。

                    i:  來自于球面的隨機采樣點

             Float3 reflect(float3 i,float3 n){return i⑵*dot(i,n)*n}

 

反射是很容易計算的,并且將隨機平面法向量存儲在紋理中是非常足夠的。

 

15:使用屏幕空間環境光遮蔽只計算環境光得到的效果(注意在遠距離處,遮蔽使得色彩非常的暗)

 

 

16:場景A使用特殊材質使ssao可視化的1個樣例(左:使用ssao,右:未使用ssao)

 

17:場景B使用特殊材質使ssao可視化的1個樣例(左:使用ssao,右:未使用ssao)

 

18:場景A使用特殊材質使ssao可視化的1個樣例(左:使用ssao,右:未使用ssao)

多細節層次(LOD)

1.現狀

當渲染的復雜度不容易控制的時候,層次細節技術(LOD)是非常重要的,很多游戲通常使用霧化效果對視野做了很大的限制,乃至有時候依托層次設計來強行遮蔽掉遠處的信息。這也就是為何大多數游戲都是以室內環境為主導的,但是在“孤島危機I”中,我們希望能夠展現非常遠處的風景和許多細節,同時不限制玩家的視角和運動位置。因此,我們保持了“孤島危機”中的視角范圍,但是我們為模型增加了不同層次的高質量細節描寫。質量的提升意味著我們需要使用更加復雜的著色器,更加高質量的紋理。全新的紋理類型(例如地表紋理)和更多的網格點。由于我們還希望使用z緩沖前置技術和實時陰影效果,所以我們需要對每一個模型對象付出更多的代價。而過量的drawcall使得CPU負擔增加,不過這在Directx10上有所改良。因此在“孤島危機”中,我們可以很輕易的在美工創作的不同細節程度的模型中進行切換。固然,我們還為植被添加了1些欺騙的技術以改良他們在游戲中的運行效力(pancy:估計是billboard或cross billboard之類的公告板技術 )但是這不屬于本章的討論范圍。

“孤島危機”中,我們打算使用1個基于移動頂點的平滑的LOD過度。但是這類技術常常對模型創建帶來很多限制。而如果沒有這類限制的話模型常常能夠快速而高效的建立出來。特別是那些需要alpha測試或alpha混合的植被模型。這使得有時候我們的模型來不及建立LOD轉換而不能不在顯示demo的時候直接取消低LOD等級的部份。用于演示demo的機器具有非常高的硬件配置因此低等級的LOD其實不能增強運算速度。而低等級的LOD所援用的范圍通常在屏幕上只占很少的1部份,所以總的像素消耗是很少的。使用大量的LOD還有可能適得其反,由于這項技術其實不容易讓不同層級的對象完善融會,并且我們還得消耗更多的draw call。

2.融會技術

我們的1個程序員終究想到了1個基于在z緩沖前置事前進行模型融會的方式來柔化LOD的轉換。而在我們以后的額渲染進程中只需要打開z緩沖前置。固然這其實不是1個完全正確的方法由于物體的表面有可能會具有相同的深度值,這樣使用add類型的alpha混合(pancy:add型混合 finalpixel = sourcepixel + destpixel)使得這些點取得了兩倍的亮度。但是由于每一個物體第1次渲染的目標幀緩沖區不允許混合,所以這類情況只有在以后的pass才有可能產生。不過我們將所有的光照合并到了1個pass當中,因此這類情況產生的幾率就非常小了。融會后的紋理屬于屏幕空間的1個投影,然后我們隨機從紋理中收集1個值與每一個物體的變換值進行融會,并在以后使用簡單的alpha測試來排除不符合要求的點。我們在最新的圖形硬件卡上采取了較為新穎的alpha2coverage(A2C)技術(pancy:alphatocoverage技術,通常alpha測試由于簡單地根據alpha排除不透明點使得邊界鋸齒嚴重,為了到達類似于alpha混合的效果,DIrectx10使用了1種叫A2C的方法來消除1些alpha測試留下的鋸齒)和全屏抗鋸齒技術(FSAA)在亞像素級別上進行優化。即使不使用FSAA技術,如果我們使用到我們的邊沿模糊后處理效果,融會的瑕疵也不宜被發覺到。最初我們只是根據模型與視點的距離來進行狀態的過度。當時處于過渡期的模型的渲染速度和質量都變得很差,因此我們決定在過渡期隱藏這些模型。這也就是為何我們為模型過度添加了1小段代碼以讓其在定義的1段時間內完成。我們不單單對變換的3D對象使用融會技術,還將這項技術用于隱藏遠處的模型和隱藏過渡期間的模型已到達欺騙視覺的效果。

3.水面的LOD技術

海面或大范圍的水面通常具有特殊的屬性,因此可使用特殊的渲染算法進行渲染。最初我們在“孤島危機”中實現的水面是1個隨著玩家運動的簡單網格,由像素著色器,反射效果和透明度決定了水面的視覺效果。但是,我們希望具有真實的3D波浪,固然不是基于物理摹擬,而是1種便宜的解決方案。我們嘗試通過使用基于FFT(pancy:快速傅里葉變換)的水波仿真([Jensen01a], [Tessendorf04]).要想取得3D的波浪就必須要進行必要的頂點操作,而我們以往使用的網格模型明顯是不能夠做這樣的操作的。

4.立方水域

前面提到的FFT僅僅適能夠輸出海面的較小的1部份,因此我們必須將表面渲染很屢次才能取得想要的范圍。不同的細節層次所使用的索引緩沖區不同,但是他們同享1個由FFT生成的頂點緩沖區(pancy:頂點緩沖區決定組成幾何體的多邊形的頂點位置,索引緩沖區決定了多邊形的組織方式。)我們雖然同享了所有LOD的頂點緩沖區以節省內存,但是為了更好地渲染質量(pancy:也就是LOD中被認為不重要的幾何體需要下降渲染質量)我們需要更好的向下采樣方式。為了減少隨距離而產生的混淆現象和限制低質量多邊形的外觀,對近處的點,我們淡化了其對遠處頂點的擾動。并且大大限制了其對周圍近處頂點的擾動(pancy:大概是很大程度上簡化了液體之間的受力方式)。這類方法確切起到了作用但是很多美工建議我們還是再找1些更好的方法。

5.屏幕空間曲面細分

我們決定使用1些暴力的方法,這類方法很簡單,但是很好的解決了問題。我們使用1個提早計算好的屏幕空間曲面細分4邊形并且將所有的水面頂點投影到這張4邊形上。這項操作必須嚴格保證z緩沖區的正確性,乃至我們還要裁剪掉所有地平面上面的頂點所產生的像素。為了能夠使用FFT波浪摹擬數據來修改頂點的位置,我們需要建立1張頂點紋理索引,由于這項技術其實不能在硬件上實現(pancy:硬件曲面細分始于directx11,當時雖然有使用曲面細分摹擬水面的算法但是只能通過1些別的手段實現這項功能)

                       

                        2:屏幕空間曲面細分產生的波浪

線框中可以注意到的垂直線條是由于我們為了更好的日升頂點緩沖區性能所做的頂點分層。這個結果看上去讓我們覺得終究成功的希望很大,但是屏幕邊界上的頂點總是在闊別邊界的位置,這是1個很嚴重的問題。固然,為緩沖區擴容,以包括哪些超越邊界的頂點可以解決這個問題。不過衰減頂點的擾動的方法更合適,由于不但對屏幕邊界影響其實不是很明顯,并且還能最小化的增加額外本錢。

 

3:左:不做衰減頂點擾動的屏幕空間曲面細分(注意左側界的部份沒有被包括到水面)。右:衰減頂點擾動的屏幕空間曲面細分。

為了更好的提高性能,我們減少了頂點的細分程度,而即使我們使用比之前少很多的頂點,工程的質量依然是可接受的。取景角度的傾斜將使得渲染效果大大下降,這不是我們期望的結果。主要緣由是邊沿衰減主要依賴于水面方向的攝像機,而不是真實的物理摹擬。因此我們不能不減少波動的幅度以解決這個問題。

6.攝像機對齊

剩余的1些歷史遺留的鋸齒混淆問題和物理運動學的問題困擾著我們的shader程序員。然后他花了1些時間找到了1個以下的解決方案:這類新的方法更之前1樣使用了1個靜態的網格。但是這個網格的投影從之前的單1角度轉換成了簡單的上下投影。全部網格由攝像機來進行移動,我們通過調劑攝像機的偏移量以使得攝像機面對方向所獲的頂點數量最大化。要渲染地平線以上的頂點,我們就需要對網格的邊沿進行顯著的擴大。而這些頂點的曲面細分不再很關鍵由于對這類遠距離定點,其受擾動的系數幾近可以視為0。

      

204:攝像機對齊后的水面網格的線框:左:上下投影的攝像機對齊空間,右:從視察者角度觀看的相機空間。

這類做法得到的效果要優于屏幕空間的做法,特別是在相機做微小的運動的時候更加的明顯。除隨距離的衰減,水波現在是與視察者位置無關的。因此現在使用CPU摹擬FFT物理運動是可行的。

 

21:左:攝像機對齊的結果。右:用于比較的屏幕空間曲面細分

總結

通過這次曲折的探究,我們不但找到了我們的下1代引擎的發展方向,還從中學到了很多的東西。為了找到,驗證和比較不同的解決方案,學習的進程是必不可少的。在過去的說法中,這項工作可以被歸類于研究工作。我們認為我們選取他人的研究成果最大的根據是質量,生產時間,性能和可擴大性。“孤島危機II”,我們的新1代的游戲,是1個巨大的工程,為了掌控這項工程,時間是非常重要的。1個解決方案的性能與硬件息息相干(如CPU,GPU,內存),因此對不同的平臺我們都可能要重新斟酌我們所使用的算法。目前的引擎對具有多個核心的CPU和較為快速的支持Directx9和Directx10的顯卡來講優化是不錯的。在初期使用z測試前置得到的深度信息也是很有用的,很多功能現在都依賴于這個數據。如今,更加規范的延遲渲染像素數據也包括了更多的像素信息,比如漫反射色彩,法線,和1些特殊的材質。對渲染外星人的室內場景,延遲渲染多是最好的解決方案,但是其他的環境則不能從中受益,由于只有1個光源的情況下延遲渲染其實不能很好的發揮其優勢。

致謝

此次演示文稿是很多程序員,美工和設計師們共同努力的結果。在這里我們要特別感謝Vladimir Kajalin, Andrey Khonich,Tiago Sousa, Carsten Wenzel 和Nick Kasyan. 我們已成了NVIDA的合作火伴,我們取得了他們的現場幫助而包括而不但限于G80 Directx9和Directx10方面的問題。因此特別感謝NVIDA的工程師Miguel Sainz, Yury Uralsky 和 Philip Gerasimov。同時為業界的領袖企業Microsoft,AMD,Intel,NVIDA和其余的支持過我們工作的公司致以感謝。同時為幫助我完成這篇論文的Natalya Tatarchuk 和Tim Parlett致以感謝。

援用

[ATI04] ATI 2004, Radeon X800 3DcTM Whitepaper http://ati.de/products/radeonx800/3DcWhitePaper.pdf  

[DL06] DONNELLY W. AND LAURITZEN A. 2006. Variance shadow maps. In Proceedings of the 2006 ACM SIGGRAPH Symposium on Interactive 3D graphics and games, pp. 161⑴65. Redwood City, CA  

[ISIDORO06] ISIDORO J. 2006. Shadow Mapping: GPU-based Tips and Techniques. GDC presentation. http://ati.amd.com/developer/gdc/2006/Isidoro-ShadowMapping.pdf   

[JENSEN01]  JENSEN, H. W. 2001. Realistic image synthesis using photon mapping, A. K. Peters, Ltd., Natick, MA.   

[JENSEN01a] JENSEN, L. 2001, Deep-Water Animation and Rendering, Gamasutra article http://www.gamasutra.com/gdce/2001/jensen/jensen_pfv.htm  

[LANDIS02] LANDIS, H., 2002. RenderMan in Production, ACM SIGGRAPH 2002 Course 16.  

[MICROSOFT07] MICROSOFT DIRECTX SDK. April 2007.   http://www.microsoft.com/downloads/details.aspx?FamilyID=86cf7fa2-e953⑷75cabde-f016e4f7b61a&DisplayLang=en   

[MT04] MARTIN, T. AND TAN, T.-S. 2004. Anti-aliasing and continuity with trapezoidal shadow maps. In proceedings of Eurographics Symposium on Rendering 2004, pp. 153–160, 2004.  

[MCTAGGART04] MCTAGGART, G. 2004. Half-Life 2 Shading, GDC Direct3D Tutorial  http://www2.ati.com/developer/gdc/D3DTutorial10_Half-Life2_Shading.pdf   

[MITTRING04] MITTRING, M. 2004. Method and Computer Program Product for Lighting a Computer Graphics Image and a Computer. US Patent 2004/0155879 A1, August 12, 2004.   

[SD02] STAMMINGER, M. AND DRETTAKIS, G. 2002. Perspective shadow maps. In SIGGRAPH 2002 Conference Proceedings, volume 21, 3, pages 557–562, July 2002  

[TESSENDORF04] TESSENDORF, J. 2004. Simulating Ocean Surfaces. Part of ACM SIGGRAPH 2004 Course 32, The Elements of Nature: Interactive and Realistic Techniques, Los Angeles, CA   

[URALSKY05] URALSKY, Y. 2005. Efficient Soft-Edged Shadows Using Pixel Shader Branching. In GPU Gems 2, M. Pharr, Ed., Addison-Wesley, pp. 269 – 282.  

[WENZEL05] WENZEL C. 2005. Far Cry and DirectX. GDC presentation, San Francisco, CA  http://ati.amd.com/developer/gdc/D3DTutorial08_FarCryAndDX9.pdf  

Advanced Real-Time Rendering in 3D Graphics and Games Course – SIGGRAPH 2007

121

[WENZEL06] WENZEL, C. 2006. Real-time Atmospheric Effects in Games. Course 26: Advanced Real-Time Rendering in 3D Graphics and Games. Siggraph, Boston, MA. August 2006  http://ati.amd.com/developer/techreports/2006/SIGGRAPH2006/Course_26_SIGGR APH_2006.pdf  

[WENZEL07] WENZEL C. 2007. Real-time Atmospheric Effects in Games Revisited. Conference Session. GDC 2007. March 5⑼, 2007, San Francisco, CA. http://ati.amd.com/developer/gdc/2007/D3DTutorial_Crytek.pdf  

[ZIK98] ZHUKOV, S., IONES, A., AND KRONIN, G. 1998. An ambient light illumination model. In Rendering Techniques ’98 (Proceedings of the Eurographics Workshop on Rendering), pp. 45–55.

 

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品精品视频 | 亚洲乱码在线播放 | 97精品伊人久久久大香线焦 | 91日本在线观看亚洲精品 | 亚洲精品第四页中文字幕 | 亚洲特黄大黄一级毛片 | 精品亚洲一区二区三区 | 在线欧美69v免费观看视频 | 亚洲午夜久久久久国产 | 亚洲成年网站 | 国产美女主播一级成人毛片 | 日韩精品片 | 亚洲欧美日本韩国 | 国产精品成熟老女人 | 俺去俺来也www色官网免费的 | 国产亚洲欧美另类久久久 | 亚洲欧美综合色区小说 | 亚洲第一中文字幕 | 国产一区二区三区在线免费 | 中文字幕第6页 | 成人国产精品 | 一区二区三区在线看 | 本地毛片 | 欧美日韩成人在线观看 | 日本在线一区二区 | 欧美啪啪毛片一区二区 | 国产综合亚洲欧美日韩一区二区 | 毛片毛片毛片 | 亚洲精品无码不卡 | 国产视频一区在线播放 | 日韩精品国产自在久久现线拍 | 免费观看亚洲视频 | 亚洲成人第一 | 国产成人免费手机在线观看视频 | 亚洲天堂黄色 | 成人a级高清视频在线观看 成人a毛片高清视频 | 亚洲精品影院久久久久久 | 日韩免费一区二区三区在线 | 伊人久久大香线蕉观看 | 中文版在线乱码在线看 | 国产高清不卡一区二区 |