OpenGL中的几何体实例化(OpenGL Geometry Instancing)
??????在GPU Gems 2中有一篇文章是專門介紹幾何體實(shí)例化的,不過(guò)它是基于DirectX的。經(jīng)過(guò)多年的發(fā)展,OpenGL在幾何體實(shí)例化方面也做出了改進(jìn),于2008年在OpenGL3.0中正式引入實(shí)例化函數(shù),該函數(shù)只被NVIDIA 8系列以上顯卡支持。
??????幾何體實(shí)例化,是通過(guò)對(duì)具有相同頂點(diǎn)數(shù)據(jù)的幾何體,賦予不同的空間位置、顏色或紋理等特征,從而創(chuàng)造出不同實(shí)例對(duì)象的技術(shù)。尤其適合于草地、石塊、數(shù)目、士兵群等對(duì)象的繪制。它的好處在于,只需傳遞一次單個(gè)模型的頂點(diǎn)數(shù)據(jù)(或者說(shuō)調(diào)用一個(gè)批次的繪制指令),再傳遞不同對(duì)象的特征數(shù)據(jù),就能實(shí)現(xiàn)多個(gè)對(duì)象的繪制。
??????最早,OpenGL是不支持幾何體實(shí)例化的。它通過(guò)即時(shí)模式,調(diào)用glDrawElements等函數(shù),能較高效的實(shí)現(xiàn)多個(gè)對(duì)象的繪制。然而,這還是會(huì)造成占用大量的VBO存儲(chǔ)空間和數(shù)據(jù)傳輸帶寬。
??????在GPU可編程后,通過(guò)設(shè)置全局統(tǒng)一參數(shù)glUniformMatrix4fvARB來(lái)傳遞對(duì)象的特征數(shù)據(jù)給Vertex Shader,來(lái)間接實(shí)現(xiàn)實(shí)例化。然而這還是不能夠減少繪制指令的調(diào)用次數(shù)。
??????而后,NVIDIA提出了偽實(shí)例化(pseudo-instancing)的方法,利用頂點(diǎn)數(shù)據(jù)指令,如glColor3f、glTexCoord、glMultiTexCoord等,將對(duì)象的特征數(shù)據(jù)傳遞給Vertex Shader。雖然這同樣不能減少繪制指令的調(diào)用次數(shù),但它卻比方法2提高了2~3倍的效率。原因有2:一是方法2中的全局統(tǒng)一參數(shù)函數(shù)設(shè)置的是GPU寄存器,或者說(shuō)是改變Vertex shader當(dāng)前的全局處理狀態(tài),很顯然將等待當(dāng)前GPU正在執(zhí)行的Vertex process完成后才能返回,即需要CPU等待GPU完成該對(duì)象的繪制,存在嚴(yán)重的效率問(wèn)題[1];二是全局統(tǒng)一參數(shù)函數(shù)設(shè)置的GPU寄存器是全局共享的,Vertex Shader拜訪該寄存器所耗費(fèi)的時(shí)間顯然要多于拜訪本地寄存器(由頂點(diǎn)數(shù)據(jù)指令設(shè)置的)所花費(fèi)的時(shí)間。
??????最后,ARB終于通過(guò)了實(shí)例化的函數(shù)ARB_draw_instanced,有兩個(gè):DrawArraysInstancedARB、DrawElementsInstancedARB。在GLSL中,通過(guò)instance ID獲取實(shí)例的ID,加以控制。這兩個(gè)函數(shù)不能用在顯示列表中。
??????JeGX對(duì)以上四種方法進(jìn)行了測(cè)試,有興趣的童鞋,可以點(diǎn)擊鏈接去看看。測(cè)試的結(jié)論是[2]:
??????1、在OpenGL中,每個(gè)實(shí)例的頂點(diǎn)數(shù)越小,實(shí)例化帶來(lái)的效率提升越明顯。因此要盡量將實(shí)例模型的面數(shù)和頂點(diǎn)數(shù)控制到最小。
??????2、新的實(shí)例化函數(shù),雖然減少了指令的個(gè)數(shù),但當(dāng)實(shí)例模型的面數(shù)和頂點(diǎn)數(shù)比較大的時(shí)候,好像沒(méi)有帶來(lái)太大的性能改變。
??????我曾經(jīng)把特征數(shù)據(jù)編碼進(jìn)頂點(diǎn)紋理,通過(guò)Vertex Shader來(lái)獲取,實(shí)現(xiàn)實(shí)例化,然而效果好像并不是非常明顯(相較于第2種方法而言)。目前還沒(méi)有試驗(yàn)第4種方法,希望以后有時(shí)間的時(shí)候來(lái)試驗(yàn)一下。
?
參考文獻(xiàn):
1、http://www.cnitblog.com/linghuye/archive/2008/03/17/41049.html
2、http://www.ozone3d.net/blogs/lab/?p=87
3、http://www.gamerendering.com/2008/10/21/instancing/
4、http://www.qiannao.com/space/show/jamesclarke/glsl_pseudo_instancing.pdf/.page
5、http://www.opengl.org/registry/specs/ARB/draw_instanced.txt
轉(zhuǎn)載于:https://www.cnblogs.com/jamesclarke/archive/2009/07/08/1519462.html
總結(jié)
以上是生活随笔為你收集整理的OpenGL中的几何体实例化(OpenGL Geometry Instancing)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在windows storage ser
- 下一篇: MonoRail学习-介绍篇(一)