国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

OpenGL使用可編程管線實(shí)現(xiàn)屏幕空間環(huán)境光遮蔽

2018-06-06 10:14易湘舟李永李敏
電腦知識(shí)與技術(shù) 2018年7期

易湘舟 李永 李敏

摘要:OpenGL計(jì)算機(jī)圖形編程接口實(shí)現(xiàn)了計(jì)算機(jī)對(duì)3D圖形的渲染功能,然而舊版本的OpenGL(兼容版 compatibility profile)是采用固定管線的渲染模式對(duì)圖形進(jìn)行渲染,固定管線中的渲染程序是固定的,OpenGL用戶無法更改這類渲染程序,這使得舊版本OpenGL的使用者實(shí)現(xiàn)的功能受到了很大的限制。新版本的OpenGL(核心板 core profile)則采用了可編程管線模式對(duì)圖形進(jìn)行渲染,可編程管線相對(duì)于傳統(tǒng)固定管線的優(yōu)勢(shì)在于圖形該如何和渲染可以由OpenGL用戶來實(shí)現(xiàn),從而使OpenGL的靈活性得到擴(kuò)展。將通過可編程管線來實(shí)現(xiàn)傳統(tǒng)固定管線難以實(shí)現(xiàn)的環(huán)境光遮蔽效果。

關(guān)鍵詞:OpenGL;可編程渲染管線;屏幕空間環(huán)境光遮蔽

中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)07-0173-03

OpenGL作為一個(gè)成熟而久負(fù)盛名的跨平臺(tái)的計(jì)算機(jī)圖形應(yīng)用程序接口規(guī)范,它已經(jīng)被廣泛用于游戲、影視、軍事、航空航天、地理、醫(yī)學(xué)、機(jī)械設(shè)計(jì),以及各類科學(xué)數(shù)據(jù)可視化的領(lǐng)域[1~3]。目前大部分的研究均基于OpenGL實(shí)現(xiàn)[4]。隨著時(shí)間的推移以及計(jì)算機(jī)圖形學(xué)的發(fā)展,OpenGL自身也進(jìn)行了很多的更新?lián)Q代,在OpenGL3.0中,某些特性被標(biāo)記為“不鼓勵(lì)使用的”,也就是說這些特性在未來的OpenGL版本中可能會(huì)被刪除。而被標(biāo)記“不鼓勵(lì)使用的”功能主要目的是推動(dòng)OpenGL標(biāo)準(zhǔn)的發(fā)展[5],所以為了提高程序的規(guī)范性和兼容性,開發(fā)者有必要了解并使用OpenGL核心模式(core profile)。在核心模式中,開發(fā)者可以更靈活的渲染、處理自己的模型以獲得更多的效果。

1 系統(tǒng)原理及結(jié)構(gòu)

OpenGL中所有的事物都被放在一個(gè)抽象的3D空間之中,然而屏幕只是一個(gè)二維的像素陣列,并不是一上來就可以直接顯示3D圖像的,所以O(shè)penGL的任務(wù)是將3D圖形從一堆二進(jìn)制數(shù)據(jù)的形態(tài)轉(zhuǎn)換成能夠顯示到屏幕上的每一幀圖片。而OpenGL的渲染管線先將頂點(diǎn)數(shù)據(jù)的3D坐標(biāo)轉(zhuǎn)換為2D坐標(biāo)讓它符合正常人的視覺習(xí)慣,然后再根據(jù)渲染規(guī)則為每個(gè)像素染上合適的RGB顏色。

OpenGL管線結(jié)構(gòu)示意圖[6]

當(dāng)調(diào)用OpenGL的glDrawArrays()函數(shù)之后GPU會(huì)根據(jù)頂點(diǎn)數(shù)組中的坐標(biāo)數(shù)據(jù)和指定的模式,對(duì)傳進(jìn)來的頂點(diǎn)數(shù)據(jù)進(jìn)行一系列的處理,這些處理分別由著色器和一些硬件固定操作完成,其中著色器(Shader)是一類可編程的程序模塊,在OpenGL中它由程序員使用類似于C語言的GLSL(OpenGL Shader Language)來完成,我們可以通過shader來告訴顯卡該怎么渲染目標(biāo)頂點(diǎn)所構(gòu)成的3D圖形。現(xiàn)代的GPU具備了很強(qiáng)的可編程性,用戶可以通過編寫高級(jí)著色程序控制渲染管線中的各個(gè)模塊,極大擴(kuò)展了GPU的功能,將原來由CPU承擔(dān)的運(yùn)算遷移到GPU完成[7]。

2 屏幕空間環(huán)境光遮蔽問題的分析與解決方案的實(shí)現(xiàn)

2.1 屏幕空間環(huán)境光遮蔽的預(yù)期目標(biāo)

經(jīng)典而又常見的三種光照模:Lambert,Phong,BlinnPhong都使用了理想的環(huán)境光,然而環(huán)境光主要是用來描述從空氣中散射到物體上的光線的,因此理想的環(huán)境光照忽略了當(dāng)兩個(gè)或多個(gè)面上的像素相距非常近時(shí)的情形,這種情形下兩個(gè)或多個(gè)面上的像素會(huì)相互遮擋散射過來的光線從而導(dǎo)致該面的局部反射的光線要少于理想模型下的光照所反射的光線。所以為了提高所渲染的物體的真實(shí)程度,必須對(duì)被遮擋的部分進(jìn)行加深處理。

解決這個(gè)問題可以從模型的貼圖著手,在模型被建立出來后模型師會(huì)對(duì)模型的UV貼圖進(jìn)行烘焙處理,這個(gè)過程就是一種靜態(tài)的處理環(huán)境光遮蔽的方式,然而這種方式也有它的弊端:第一,當(dāng)模型綁定了骨骼之后,模型的動(dòng)作會(huì)產(chǎn)生變化導(dǎo)致遮蔽位置的變更,或者與其他物體相靠近后對(duì)比效果會(huì)存在差異;第二,紋理貼圖加載的時(shí)間會(huì)變得更長(zhǎng)。但從渲染效果方面考慮的話,前者的影響會(huì)變得更大。未開啟AO(Ambient Occlusion環(huán)境光遮蔽)特效的畫面光照稍亮一些;而開啟AO特效之后,局部的細(xì)節(jié)畫面尤其是暗部陰影會(huì)更加明顯一些[8]。

因此為了提高效果,我們必須得從渲染環(huán)節(jié)著手動(dòng)態(tài)解決這個(gè)問題。也就是利用OpenGL可編程管線來解決這個(gè)問題,使每一幀輸出圖像都具有環(huán)境光遮蔽的效果而且該效果不會(huì)受到模型的變化所帶來的影響。

2.2 屏幕空間環(huán)境光遮蔽的原理

2.2.1 延遲渲染

與延遲渲染相對(duì)應(yīng)的是正向渲染,在頂點(diǎn)數(shù)據(jù)(包括頂點(diǎn)的位置數(shù)據(jù)以及法向量數(shù)據(jù))被送入處頂點(diǎn)著色器之后,正向渲染會(huì)計(jì)算出所有面的被光照后的顏色包括最終會(huì)被深度測(cè)試裁剪掉的面也會(huì)被渲染上顏色,這樣就產(chǎn)生了不必要的計(jì)算。而延遲渲染的原理則是先讓頂點(diǎn)數(shù)據(jù)過一遍管線,剔除掉最終無法顯示到屏幕上的面,然后輸出到G-Buffer,G-Buffer上一般包含了將渲染的每一片段的位置信息(Position)法向量(Normal vector)和深度信息(Depth),再將G-buffer中的信息送入管線讓著色器對(duì)其進(jìn)行處理。此法可提高渲染效率避免計(jì)算被遮蔽的面。但缺陷是不便于處理透明物體。

有了G-buffer中的可見三維空間信息,我們就可以利用GPU來處理我們的圖像,經(jīng)過多重pass,最后混融并渲染到我們的屏幕上。

第一遍pass經(jīng)過片段著色器后輸出以下紋理到幀緩沖區(qū):

其中:

圖2展示了第一個(gè)紋理,即每個(gè)片段的位置信息(gPosition);

圖3展示了第二個(gè)紋理,即每個(gè)片段的法向量信息(gNormal);

圖4展示了第三個(gè)紋理,即每個(gè)片段的深度信息(gDepth)。

2.2.2 環(huán)境光遮蔽采樣

為了使被遮蔽的面上產(chǎn)生陰影,首先應(yīng)該獲取每一片段的信息并對(duì)其周圍半球內(nèi)是否有面遮擋進(jìn)行隨機(jī)采樣,根據(jù)采樣的結(jié)果來削弱該片段的環(huán)境光反射分量,將樣本核心通過矩陣變換沿著法向量的方向布置在片段上,計(jì)算每個(gè)樣本的深度使之與G-buffer中的深度比較,如果樣本值小于G-buffer中的深度且它們之間的距離不太遠(yuǎn),則說明該樣本被遮蔽了。由于采用的是G-buffer中的深度數(shù)據(jù)進(jìn)行采樣,所以被丟棄的不可見片段無法參與采樣。這使得在多個(gè)邊緣的交界處的遮蔽分量比正向渲染得到的要少一點(diǎn),從而在細(xì)微的視覺效果上產(chǎn)生缺失。為了方便我們只用rgb中的r值(紅色),r值越低,表示遮蔽因子越大,看起來越黑。

輸入紋理:

經(jīng)過采樣后片段著色器輸出得到紋理:

2.2.3 模糊化

計(jì)算出遮蔽分量后其效果如果所示,顯然如果直接運(yùn)用,陰影效果會(huì)顯得非常生硬,這時(shí)我們需要將我們的環(huán)境光遮蔽效果使用均值模糊將其模糊化,讓它看起來更加柔和自然。

輸入紋理:

得到紋理:

2.2.4 添加光照

根據(jù)第一遍pass得到的gPosition,gNormal,gDepth和光源位置和亮度計(jì)算每一個(gè)片段的rgb顏色值。

其中,漫反射光照亮度的計(jì)算需要與第三遍pass得到的紋理的r值(遮蔽因子)相乘。

每一片段的顏色(FragColor) =環(huán)境光光照 (Ambient) +漫反射光光照 (Diffuse) +鏡面反射光光照 (Specular)

其中環(huán)境光光照需額外乘遮蔽因子。

3 ssao實(shí)現(xiàn)前后的效果

4 結(jié)語

通過可編程管線操控GPU并行處理3D圖形程序早已成為圖形編程的主流固定管線的,即使OpenGL開發(fā)團(tuán)隊(duì)也對(duì)以前的一些舊特性進(jìn)行了限制不鼓勵(lì)開發(fā)者使用。使用可編程管線可以實(shí)現(xiàn)原來固定管線難以實(shí)現(xiàn)的功能,比如SSAO屏幕空間環(huán)境光遮蔽技術(shù),先通過幀緩沖存儲(chǔ)片段信息,然后再利用可編程管線中的片段著色器對(duì)幀緩沖中的信息進(jìn)行采樣,根據(jù)被遮蔽的樣本量來決定片段的遮蔽分量,再通過均值模糊讓陰影顯得更加柔和,最終使用可編程管線渲染最后的圖像。相比傳統(tǒng)固定管線,可編程渲染管線大大提高了程序的靈活性,可以實(shí)現(xiàn)固定管線幾乎無法實(shí)現(xiàn)的功能。

參考文獻(xiàn):

[1]Dave Shreiner, Graham Sellers, John Kessenich,等.OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3 Eight Edition[M].王銳,譯.北京:機(jī)械工業(yè)出版社,2014.

[2]詹發(fā)新.地形可視化的進(jìn)展與評(píng)述[J].四川測(cè)繪,2004(2).

[3]高武俊,張繼賢,張永紅.基于OpenGL的地形3維可視化研究[J].測(cè)繪通報(bào),2002(S1).

[4]劉浩,趙文吉,段福洲,等.基于GPU的地下管線三維可視化建模研究[J].計(jì)算機(jī)工程與應(yīng)用,2013(8).

[5]Richard S.Wright.Jr, Nicholas Haemel, Graham Sellers,等.OpenGL SuperBible Fifth Edition[M].付飛,李艷輝,譯.北京;人民郵電出版社,2012.5.

[6] Khronos OpenGL4.4PiplineMap

[7] 劉磊,馮前進(jìn),王文輝,等. 基于GPU的醫(yī)學(xué)圖像快速面繪制[J]. 計(jì)算機(jī)工程與應(yīng)用,2007,43(32):189-191.

[8] 楊志成.一種改進(jìn)的屏幕空間環(huán)境光遮蔽(SSAO)算法[J].現(xiàn)代計(jì)算機(jī),2017(8).