999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

透明物體的多光源實時光照

2018-04-02 08:25:11余瀚游茍成秋
現代計算機 2018年2期
關鍵詞:深度

余瀚游,茍成秋

(1.四川大學視覺合成圖形圖像技術國防重點學科實驗室,成都 610065;2.四川大學計算機學院,成都 610065)

0 引言

隨著計算機硬件計算能力的快速發展,工業界針對游戲領域的真實感和實時性要求越來越高。而影響游戲中真實感最重要的因素就是光照。良好的實時光照算法可以改善游戲畫面渲染效果和提高用戶體驗。使用基于物理的光照算法[2]幾乎能呈現出現實生活中的光照效果,但是往往不能達到實時性的要求。現在的實時渲染[1]基本使用延遲光照(Deferred Lighting)[4-5]的算法來提高效率,但是延遲光照中不能處理透明物體的光照效果。本文采用光源鏈表的方式以統一地渲染三維場景中不同透明程度的幾何對象。

1 算法概述

隨著光源數量和場景復雜度提高,前向渲染(Forward Shading)[9]算法并不能高效進行光照計算。而延遲渲染算法通過解耦幾何計算和光照計算,可以大幅度提高渲染效率。但在延遲光照中,幾何緩沖區只能保存的是深度值最小片元(Fragment)的信息。如果在同一個像素位置同時存在透明片元和不透明片元,并且透明片元在前,那么幾何緩沖區不能同時保存多個片元信息,從而沒法同時渲染透明和不透明物體。普通做法不渲染透明物體或者額外的前向渲染透明物

1.1 延遲光照

延遲光照是屏幕空間渲染技術,避免渲染被遮擋的片元。第一個渲染過程(Render Pass)中沒有對場景幾何體進行光照計算,僅僅是保存幾何體表面信息到幾何緩沖區(G-Buffer),例如顏色,紋理,法線等。第二階段在圖像采樣位置,發現可見性表面后再進行光照計算。不同于前向渲染方法,延遲渲染的光照計算是獨立于場景復雜度。前向渲染卻會根據場景中所有光源渲染每個幾何體,在最差的情況,可能帶來的效率O(M×N),其中M代表M個物體,N代表N個光源。而延遲渲染只需要O(M+N)時間效率。

1.2 光源鏈表

體。光源鏈表的實時光照算法,具體思想是每個片元構建光源鏈表,光源加入到當前片元的鏈表中。接著,通過訪問光源鏈表,如果片元的世界坐標系的位置位于光源影響范圍內,從而計算當前片元的光照效果。

雖然延遲光照可以很好渲染動態多光源場景,但是它并不能渲染透明物體和粒子特效。延遲光照算法中,普通做法是不渲染透明物體或者增加額外的前向渲染過程。如果不渲染透明物體,那么場景看起來不真實;額外的前向渲染會增加系統的復雜性和降低渲染效率。本文的光源鏈表(Light Linked List,LLL)[10]方法僅計算被每個光源影響的片元,不用區分透明物體和不透明物體,因此可以同時渲染透明和不透明幾何體。而且,任何沒被寫深度緩沖區的幾何體也能訪問光源資源,進而進行光照計算。LLL算法要求顯卡支持無序訪問視圖(Unordered Access Views,UAV)和原子計算器(Atomic Counter)。

2 算法實現

LLL本質是GPU鏈表[6-8],每個鏈表元素需要保存光源最小最大深度值,光源索引和Next指針。保存這些信息需要使用三個UAV資源:

(1)LightFragmentLinkedBuffer:光源鏈表緩存。存放完整的光源鏈表元素信息,結構體偽代碼定義如Algorithm2-1所示。

(2)LightBoundBuffer:光源深度范圍緩存。光源幾何體最大最小深度值需要兩次調用生成,因此要臨時保存光源深度值和索引,下次用來匹配填充完整的鏈表元素信息。

(3)LightStartOffsetBuffer:光源頭指針緩存。保存當前屏幕像素光源鏈表的頭指針,需要使用原子計算器作為分配鏈表指針的工具。

Algorithm 2-1:光源鏈表結構體struct SLightFragmentLinkedList{

uint m_LightIndex;

float m_LightMinDepth;

float m_LightMaxDepth;

uint m_Next;};

LLL算法步驟主要分為光源鏈表的構建和訪問。首先對所有光源覆蓋的片元構建鏈表,因為場景幾何體處于光源幾何體(Light Volume)內,會遮擋光源幾何體背面,所以需要關閉硬件深度測試。而要保存光源幾何體最小最大深度值,需要兩遍軟件深度測試,第一遍打開背面裁剪,第二遍打開前面裁剪,構建的光源鏈表信息保存到LightFragmentLinkedBuffer。然后渲染透明和不透明物體,并且遍歷當前片元的光源鏈表,如果幾何體的深度值處于最小最大深度值區間內,那么對幾何體進行光照渲染。

2.1 構建幾何緩沖區

渲染不透明幾何體,保存最小深度值片元的幾何信息。各個保存的幾何信息必須處于同一空間坐標下,本文中保存的是世界坐標系下的位置,材質顏色,以及世界坐標系下的法線。如果想降低GPU內存使用率,可以把世界坐標系下的位置紋理,改變為NDC(Normalized Device Coordinates)空間下只有一個通道的深度紋理,并且深度值映射到[0,1]區間。

世界坐標系位置信息需要三個浮點數通道紋理,而深度信息只需要一個浮點通道紋理。在后期的渲染階段,可以通過矩陣轉換,把深度信息還原為位置信息。因為深度緩沖區的值是非線性,所以需要轉換深度值到線性的深度表達。公式(1)中,M代表矩陣,P代表幾何體頂點坐標。

三維場景頂點經過投影變換到裁剪空間坐標系,除以齊次坐標系w分量歸一化到NDC坐標。經過轉換深度值變為公式(2)所示。

相機空間的z值總是投影到近平面,不依靠X,Y坐標的影響,造成M13=M23=M14=M24=0,并且在OpenGL的投影矩陣中M34=-1,M44=0,因此最終轉換的相機空間下的z值如公式(3)所示。

2.2 構建光源鏈表

(1)軟件深度測試

在渲染過不透明幾何體后,深度緩沖區已經寫入不透明物體的深度值。接著渲染光源幾何體可能會有圖1中的三種情況:光源被場景遮擋、光源與場景幾何體相交、光源在場景幾何體之前。

第一種情況光源幾何體深度測試失敗,完全被遮擋意味著看不見光照效果,因此光源幾何體不用加入到光源鏈表。第三種情況時深度測試成功,容易保存光源最大最小深度值。但是第二種情況,因為光源的背面被場景遮擋,造成背面深度測試失敗,所以不能取得背面的深度值。為了保證光源結合體的背面被像素著色器處理,需要關閉硬件深度測試,在片元著色器中進行軟件深度測試。

(2)分配鏈表

圖1 光源和場景幾何體

圖2 光源鏈表結構初始圖

如圖2所示,LightFragmentLinkedBuffer結構存儲最大最小深度值,幾何體的最小最大深度值被硬件光柵化,卻是在不同的時間傳送到片元著色器。光源幾何體的最小深度值等于光源正面的深度值,最大深度值等于光源背面的深度值。

第一遍Pass打開背面裁剪,僅允許光柵化光源幾何體正面。在OpenGL的片元著色器中可以通過gl_FrontFacing判斷是否當前三角片元是否為正面。當前片元為正面時執行軟件深度測試。并且比較當前光源結合體的深度值和深度緩沖器的深度值,如果深度測試失敗,那么提前返回,不必接著做后續計算。光源索引可通過OpenGL原子計算器執行遞增操作,每個片元都會得到唯一的正整數值。LightStartOffsetBuffer使用頭插法來更新頭指針鏈表。而LightFragmentLinkedBuffer寫入光源的索引,最小深度值,以及Next指針。因為現在沒法得到光源幾何體的背面深度值,所以暫時不寫入最大深度值。

第二遍Pass打開正面裁剪,硬件光柵化光源幾何體的背面。因為LightStartOffsetBuffer紋理大小和窗口一致,所以可以通過轉換的紋理坐標取紋理值得到頭指針。根據頭指針的索引取出LightFragmentLinked-Buffer的數據,如果當前渲染的光源幾何體的索引和緩沖區數據的光源索引一致,那么更新最大深度值,并且提前結束鏈表循環。

(3)鏈表訪問

前向渲染和延遲渲染訪問光源鏈表都是一樣的方式,LightStartOffsetBuffer取出當前片元鏈表的頭指針索引。如果頭指針索引有效,那么表明當前片元存在鏈表數據。根據頭指針索引取出LightFragmentLinked-Buffer的數據,包含最小最大深度值,進行簡單的深度測試。如果當前場景幾何體的深度值在光源幾何體的深度值區間,表明會被光源幾何體所影響,進而進行光照計算。如果位于區間外,結束本次渲染繼續進行鏈表遍歷。最后計算出當前片元被光源鏈表中光源的光照值,再用 HDR(High-Dynamic Range)[3]把光照結果映射到計算機所表示的顏色區間。

3 實驗結果與分析

3.1 實驗平臺

本文算法的運行環境為:Intel Xeon CPU E3-1230 V2@3.30GHz的處理器,8G內存,顯卡為NVIDIA Ge-Force 670和Windows 10的操作系統,編程環境為Visual Studio 2012。

圖3 光源鏈表無序訪問視圖

圖4 延遲光照和LLL算法效果對比

3.2 實驗結果分析

(1)效果分析

如圖4(a)所示,在傳統延遲光照渲染光線中,程序無法處理透明物體天馬。但是在圖4(b)中,光源鏈表算法統一了不透明物體和透明的物體的光照過程,使用相同的鏈表緩存來計算光照,因此圖中天馬帶有平行光和點光源的光照效果。

(2)效率分析

表1 LLL算法和DS+FS效率對比(單位:FPS)

表1可以看出,光源鏈表算法在多光源場景中可以提高延遲光照的性能。在少量光源時,因為建立光源需要額外花費時間,所以少量光源場景時處理透明物體性能提升不明顯。而在多光源場景或者場景中存在多個透明物體時光源鏈表算法可以更好提升性能。因為延遲渲染管線需要多一個前向渲染繪制過程,其次前向渲染是沒有解耦光源和物體,最后對延遲渲染引擎也是一個額外的負擔。

光源鏈表算法統一了透明和不透明物體,光源數據都在顯存中,無需從CPU端到GPU端帶寬的占用。而且光源鏈表解耦光源和物體,只需要針對光源幾何體內部做深度測試,通過片元就進行光照,進而提高了性能。

4 結語

針對于三維場景中帶有透明物體或粒子等特效時,光源鏈表算法能幫助簡化了光照渲染管線。而且光源鏈表算法能改善延遲渲染的性能。除此之外,光源鏈表算法的靈活性容易集成傳統光照算法,例如材質是皮膚、頭發、布料、汽車噴漆等。未來的工作考慮設計緩存并發的光源鏈表結構體來進一步提高性能。

參考文獻:

[1]Tomas Akenine-Moller,Tomas Moller,and Eric Haines.Real-Time Rendering.A.K.Peters,Ltd.,Natick,MA,USA,2nd Edition,2002.

[2]Matt Pharr and Greg Humphreys.Physically Based Rendering,Second Edition:From Theory To Implementation.Morgan Kaufmann Publishers Inc.,San Francisco,CA,USA,2nd Edition,2010.

[3]Greg Ward et al.High Dynamic Range Image Encodings,2006.

[4]KOONCE,R.2008.Deferred Shading in Tabula Rasa.In GPU Gems 3,429-457.

[5]Deering,M;Winner,S;Schediwy,B.;Duffy,C.and Hunt,N.The Triangle Processor and Normal Vector Shader:A VLSI System for High Performance Graphics.In:Proceedings of the 15th Annual Conference on Computer Graphics and Interactive Techniques(SIGGRAPH 88).Vol.22,Issue 4.New York:The ACM Press,1988:21-30.

[6]Holger Gruen and Nicolas Thibieroz.Order Independent Transparency and Indirect Illumination Using Dx11 Linked Lists.Presentation at the Advanced D3D Day Tutorial,Game Developers Conference,San Francisco,CA,March 9-13,2010

[7]Nicolas Thibieroz.Order-Independent Transparency Using Per-Pixel Linked Lists.GPU Pro,2:409-431,2011.

[8]Jason C.Yang,Justin Hensley,Holger Grün,and Nicolas Thibieroz.Real-Time Concurrent Linked List Construction on the GPU.In Proceedings of the 21st Eurographics Conference on Rendering,EGSR'10,pages 1297-1304,Aire-la-Ville,Switzerland,Switzerland,2010.Eurographics Association.

[9]Markus Billeter,Ola Olsson,Ulf Assarsson.Tiled Forward Shading.GPU Pro 4:Advanced Rendering Techniques,4:99,2013

[10]Abdul Bezrati.Real-Time Lighting Via Light Linked List.Presentation at SIGGRAPH2014,2014.

猜你喜歡
深度
深度理解不等關系
四增四減 深度推進
深度理解一元一次方程
深度觀察
深度觀察
深度觀察
深度觀察
芻議深度報道的深度與“文”度
新聞傳播(2016年10期)2016-09-26 12:14:59
提升深度報道量與質
新聞傳播(2015年10期)2015-07-18 11:05:40
微小提議 深度思考
主站蜘蛛池模板: 亚洲av无码人妻| 欧美中文字幕第一页线路一| 国产精品主播| 91麻豆精品国产91久久久久| 国产丝袜精品| 五月天综合网亚洲综合天堂网| 激情视频综合网| 久久亚洲AⅤ无码精品午夜麻豆| 色综合天天综合| 日韩毛片基地| 五月综合色婷婷| 亚洲欧美自拍视频| 日本爱爱精品一区二区| 亚洲男人天堂久久| 久久精品这里只有国产中文精品 | 国产亚洲欧美在线视频| 欧美亚洲欧美| 9cao视频精品| 热re99久久精品国99热| 亚洲码一区二区三区| 欧美午夜理伦三级在线观看| 香港一级毛片免费看| 成人在线不卡| 美女扒开下面流白浆在线试听| 高清不卡一区二区三区香蕉| 亚洲视频欧美不卡| 婷婷综合亚洲| 免费观看无遮挡www的小视频| 天堂成人av| 久久青草精品一区二区三区| 国产精品午夜电影| 久久永久精品免费视频| 国产午夜精品一区二区三区软件| 久久国产av麻豆| 日本手机在线视频| 久久国产高清视频| 国产精品成人不卡在线观看| 无码综合天天久久综合网| 五月天久久综合国产一区二区| 99久久精品国产精品亚洲| 国产精品久久自在自线观看| 亚洲伊人电影| 欧美日韩成人在线观看| 热99精品视频| 91久久精品国产| 2021国产精品自拍| 人人91人人澡人人妻人人爽| 国产女同自拍视频| 欧美另类第一页| 欧美日在线观看| 午夜福利视频一区| 久热这里只有精品6| 色综合天天综合中文网| 欧美日本视频在线观看| 久久久久久国产精品mv| 欧美亚洲第一页| 免费xxxxx在线观看网站| 熟妇丰满人妻| h视频在线观看网站| AⅤ色综合久久天堂AV色综合| 夜精品a一区二区三区| 国产精品自在线天天看片| 国产真实乱子伦视频播放| 亚洲v日韩v欧美在线观看| 免费Aⅴ片在线观看蜜芽Tⅴ| 最新国产在线| 波多野结衣中文字幕一区二区| 欧美成人精品一级在线观看| 亚洲欧美日韩成人在线| 在线观看91香蕉国产免费| 亚洲欧洲一区二区三区| 玩两个丰满老熟女久久网| 国产麻豆福利av在线播放| 无码精品福利一区二区三区| 不卡无码网| 夜夜高潮夜夜爽国产伦精品| 欧美中文字幕第一页线路一| 亚洲色成人www在线观看| 免费高清毛片| 激情无码字幕综合| 久久人人妻人人爽人人卡片av| 国产精品香蕉在线|