專利名稱:基于OpenGL核心模式的光源參數(shù)設(shè)定及計(jì)算光照顏色的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及視頻圖像處理技術(shù),具體涉及一種基于OpenGL核心模式的光源參數(shù)設(shè)定及計(jì)算光照顏色的方法。
背景技術(shù):
在視頻后期特效處理與合成軟件中為了達(dá)到逼真的圖像合成效果,往往都向用戶提供一種將圖像在三維空間中合成的手段,一般稱之為三維合成器。用戶可以在三維合成器中添加任意數(shù)量的三維物體,比如平面,立方體,球體,還有從三維模型文件導(dǎo)入的三維物體等等,給這些三維物體加上材質(zhì)屬性,光照以及由特效圖中的圖像構(gòu)成的紋理即可合成出逼真的三維場景圖。其中對三維空間設(shè)置燈光以便使物體出現(xiàn)光照效果是用戶最為常用的一種渲染方式,為了達(dá)到非常逼真的效果,用戶往往會在三維場景中放置十幾個(gè)燈光甚至是數(shù)十個(gè)燈光。OpenGL(Open Graphics Library)是目前最為常用的專業(yè)圖形程序接口,是一個(gè)功能強(qiáng)大、調(diào)用方便的底層圖形庫。OpenGL的傳統(tǒng)API中直接對燈光進(jìn)行了支持,通過API 可以指定燈光的數(shù)量以及每個(gè)燈光的類型及具體參數(shù),最終這些燈光參數(shù)以內(nèi)建變量的形式傳遞給渲染器shader。但是這種傳統(tǒng)API只能最多指定8個(gè)燈光,這遠(yuǎn)遠(yuǎn)無法滿足高質(zhì)量合成軟件對燈光數(shù)量的需求;另外從OpenGL 3. 2開始的core profile已經(jīng)開始不支持很多傳統(tǒng)的OpenGL技術(shù),這其中就包括內(nèi)置的燈光機(jī)制,因此如果使用OpenGL 3. 2 coreprofile就必須通過uniform的方式給shader設(shè)定燈光參數(shù)。但這就出現(xiàn)了一個(gè)問題由于燈光的數(shù)量是動(dòng)態(tài)的,而每個(gè)燈光的種類都可能是不一樣的,所以一般來說設(shè)定燈光參數(shù)的uniform中需要給每個(gè)燈光指定類型,渲染器shader要根據(jù)每個(gè)燈光的類型來動(dòng)態(tài)地選擇不同的渲染方法,然而對于顯卡的硬件來說,具有條件分支的指令序列的執(zhí)行是比較慢的,因此這種燈光參數(shù)傳遞方式會降低處理速度,而且為了實(shí)現(xiàn)更逼真的渲染效果, 視頻后期特效處理與合成軟件一般會使用逐像素的方式進(jìn)行光照渲染,也就是說每個(gè)像素的處理都會面臨這種問題,因此就加劇了速度的下降。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對上述問題,提供一種基于OpenGL核心模式的光源參數(shù)設(shè)定及計(jì)算光照顏色的方法,以提高渲染器在進(jìn)行燈光渲染時(shí)的效率。本發(fā)明的技術(shù)方案如下一種基于OpenGL核心模式的光源參數(shù)設(shè)定方法,包括如下步驟(1)輸入光源的環(huán)境光、漫反射光以及鏡面反射光的顏色;(2)判斷光源是否為平行光,如果是,設(shè)置光源的方向矢量;如果否,則設(shè)置光源的位置參數(shù);(3)對于平行光,設(shè)置光源方向混合系數(shù)為0 ;對于非平行光,設(shè)置光源方向混合系數(shù)為1;(4)對于非平行光,根據(jù)用戶指定的值對距離衰減因子的常量距離衰減系數(shù)、線性距離衰減系數(shù)、二次距離衰減系數(shù)進(jìn)行設(shè)置;對于平行光,將上述三個(gè)系數(shù)分別設(shè)為1,0, 0 ;(5)判斷光源是否為聚光燈,如果是,計(jì)算角度衰減因子的熱點(diǎn)角度的余弦函數(shù)值、衰減角度的余弦函數(shù)值;如果否,則將上述兩個(gè)值分別設(shè)為_2,_3。進(jìn)一步,如上所述的基于OpenGL核心模式的光源參數(shù)設(shè)定方法,步驟( 中,所述的光源的方向矢量就是指平行光的逆方向;所述的光源的位置參數(shù)就是指點(diǎn)光源或聚光燈光源的位置坐標(biāo)。一種基于OpenGL核心模式計(jì)算光照顏色的方法,包括如下步驟(a)根據(jù)當(dāng)前像素的空間位置計(jì)算出與光源位置所構(gòu)成的矢量,記為燈光矢量; 然后計(jì)算出這個(gè)矢量的模即為當(dāng)前像素所表示的點(diǎn)與光源的距離;(b)根據(jù)光源的顏色以及燈光矢量利用標(biāo)準(zhǔn)公式計(jì)算出該像素的漫反射顏色與鏡面反射顏色,其和值記為光照顏色;(c)根據(jù)如下公式計(jì)算距離衰減因子distance_attenuation,distance_attenuation = 1/(constantAttenuation+linearAttenuationXIigh tDistance+quadraticAttenuationXIightDistanceXIightDistance)constantAttenuation ^J1MmS&MMUlMMi, IinearAttenuation 個(gè)生足巨離衰減系數(shù),quadraticAttenuation為二次距離衰減系數(shù),IightDistance為當(dāng)前像素所表示的點(diǎn)與光源的距離,對于平行光,常量距離衰減系數(shù)、線性距離衰減系數(shù)、二次距離衰減系數(shù)分別設(shè)為 1,0,0 ;(d)根據(jù)如下公式計(jì)算角度衰減因子anglejttenuation,angle_attenuation = smoothstep(cosPhi, cosTheta, dot(1ightVector, IightDir))其中,cosPhi為衰減角度的余弦函數(shù)值,cosTheta為熱點(diǎn)角度的余弦函數(shù)值, IightVector為燈光矢量,IightDir為平行光的方向矢量,函數(shù)smoothstep、dot都是 GLSL(OpenGL Shader Language)中的內(nèi)建函數(shù),對于點(diǎn)光源和平行光,分別將熱點(diǎn)角度的余弦函數(shù)值和衰減角度的余弦函數(shù)值設(shè)為-2,-3 ;(e)將步驟(b)中得到的光照顏色乘以步驟(C)和步驟(d)中得到的兩個(gè)衰減因子即可得出最終的光照顏色。進(jìn)一步,如上所述的基于OpenGL核心模式計(jì)算光照顏色的方法,在步驟(a)中,還包括通過如下公式對燈光矢量進(jìn)行修正的操作,IightVector = mix (IightDir,Normalize (IightVector),IightDirMixFactor)其中,IightVector為燈光矢量,IightDir為平行光的方向矢量, IightDirMixFactor光源方向混合系數(shù),函數(shù)Normalize是指計(jì)算一個(gè)向量所對應(yīng)的單位
向量,對于平行光,光源方向混合系數(shù)為O,其它燈光的光源方向混合系數(shù)為1。
本發(fā)明的有益效果如下本發(fā)明針對OpenGL核心模式提出了一種高效的燈光參數(shù)設(shè)定機(jī)制以及使用這種燈光參數(shù)設(shè)定機(jī)制所進(jìn)行的像素光照顏色的渲染方法,這種機(jī)制可以使得fragment shader在進(jìn)行燈光渲染時(shí)避免出現(xiàn)條件分支指令執(zhí)行的情況,從而大幅的提高了具有很多燈光的復(fù)雜三維場景中的渲染速度。
圖1為本發(fā)明光源參數(shù)的設(shè)置流程圖;圖2為本發(fā)明計(jì)算光照顏色的方法流程圖。
具體實(shí)施例方式下面結(jié)合具體實(shí)施方式
和附圖對本發(fā)明進(jìn)行詳細(xì)描述。針對目前的視頻特效處理軟件,如OpenGL 3.2 Core ile,一般來講,燈光分為三種類型點(diǎn)光源(point light),平行光(directional light)與聚光燈(spot light)。點(diǎn)光源需要設(shè)定的參數(shù)有光源的位置,光強(qiáng)度的距離衰減系數(shù)(衰減系數(shù)分為三個(gè),分別為二次,線性以及常量衰減系數(shù))以及光源的顏色。平行光需要設(shè)定的參數(shù)有光源的方向矢量以及光源的顏色。聚光燈需要設(shè)定的參數(shù)有光源的位置,光源的方向,熱點(diǎn)角度(hot spotangle), 衰減角度(cutoff angle),光強(qiáng)度的距離衰減系數(shù)(衰減系數(shù)分為三個(gè),分別為二階,一階以及常量衰減系數(shù);二階,一階衰減系數(shù)即可對應(yīng)二次,線性衰減系數(shù))以及光源的顏色。由此可以看出,不同的光源的參數(shù)相差很大。如圖1所示,本發(fā)明提供了一種基于OpenGL核心模式的光源參數(shù)設(shè)定方法,包括如下步驟(1)輸入光源的環(huán)境光、漫反射光以及鏡面反射光的顏色;(2)判斷光源是否為平行光,如果是,設(shè)置光源的方向矢量;如果否,則設(shè)置光源的位置參數(shù);所述的光源的方向矢量就是指平行光的逆方向;所述的光源的位置參數(shù)就是指點(diǎn)光源或聚光燈光源的位置坐標(biāo);(3)對于平行光,設(shè)置光源方向混合系數(shù)為0 ;對于非平行光,設(shè)置光源方向混合系數(shù)為1;(4)對于非平行光,根據(jù)用戶指定的值對距離衰減因子的常量距離衰減系數(shù)、線性距離衰減系數(shù)、二次距離衰減系數(shù)進(jìn)行設(shè)置;對于平行光,將上述三個(gè)系數(shù)分別設(shè)為1,0, 0 ;(5)判斷光源是否為聚光燈,如果是,計(jì)算角度衰減因子的熱點(diǎn)角度的余弦函數(shù)值、衰減角度的余弦函數(shù)值;如果否,則將上述兩個(gè)值分別設(shè)為_2,_3。上述方法的具體軟件結(jié)構(gòu)如下所示struct SLightSource {vec4 ambient ;vec4 diffuse ;vec4 specular ;
vec3 position ;//light source position in eye coordinatesvec3 IightDir ;//unit vector for light direction(toward light), in eye coordinatesfloat IightDirMixFactor ;//O for directional light ; 1 for point or spot lightfloat cosTheta ;//cosTheta must be greater than cosPhifloat cosPhi ;float constantAttenuation ;float IinearAttenuation ;float quadraticAttenuation ;};上面的結(jié)構(gòu)里面ambient,diffuse與specular三個(gè)成員為環(huán)境光,漫反射以及鏡面反射光的顏色,他們共同構(gòu)成了光源的顏色。position是光源的位置,對于平行光是不需要這一項(xiàng)的。IightDir是燈光的方向矢量(朝向燈光的矢量),只有平行光需要這一參數(shù)。IightDirMixFactor是燈光方向混合系數(shù),對于平行光這一系數(shù)為0,其它的燈光為1。cosTheta對于聚光燈就設(shè)定為熱點(diǎn)角度的余弦函數(shù)值,對于其它燈光設(shè)定為-2。cosPhi對于聚光燈就設(shè)定為衰減角度的余弦函數(shù)值,對于其它燈光設(shè)定為_3。constantAttenuation就是常量距離衰減系數(shù),對于平行光設(shè)定為1,其余的設(shè)定為用戶根據(jù)需要所指定的值。IinearAttenuation就是線性距離衰減系數(shù),對于平行光設(shè)定為0,其余的設(shè)定為用戶根據(jù)需要所指定的值。quadraticAttenuation就是二次距離衰減系數(shù),對于平行光設(shè)定為0,其余的設(shè)定為用戶根據(jù)需要所指定的值。在根據(jù)上述方法向fragment shade渲染器r的uniform中給每個(gè)燈光設(shè)定了參數(shù)之后,就可以利用如圖2所示的方法統(tǒng)一地計(jì)算出每個(gè)燈光在某像素反射的顏色,具體計(jì)算包括如下步驟(a)根據(jù)當(dāng)前像素的空間位置計(jì)算出與光源位置所構(gòu)成的矢量,記為燈光矢量; 然后計(jì)算出這個(gè)矢量的模即為當(dāng)前像素所表示的點(diǎn)與光源的距離;通過如下公式對燈光矢量進(jìn)行修正的操作,IightVector = mix (IightDir,Normalize (IightVector),IightDirMixFactor)其中,IightVector為燈光矢量,IightDir為平行光的方向矢量, IightDirMixFactor 光源方向混合系數(shù),函數(shù)Normalize 是GLSL(OpenGL ShaderLanguage) 中的內(nèi)建函數(shù),是指計(jì)算一個(gè)向量所對應(yīng)的單位向量(可參考OpenGL手冊)。對于平行光,光源方向混合系數(shù)為0,其它燈光的光源方向混合系數(shù)為1。(b)根據(jù)光源的顏色以及燈光矢量利用標(biāo)準(zhǔn)公式計(jì)算出該像素的漫反射顏色與鏡面反射顏色,其和值記為光照顏色。(c)根據(jù)如下公式計(jì)算距離衰減因子distance_attenuation,
distance_attenuation = 1/(constantAttenuation+linearAttenuationXIigh tDistance+quadraticAttenuationXIightDistanceXIightDistance)constantAttenuation ^J1MmS&MMUlMMi, IinearAttenuation ^J^fi^g 離衰減系數(shù),quadraticAttenuation為二次距離衰減系數(shù),IightDistance為當(dāng)前像素所表示的點(diǎn)與光源的距離,對于平行光,常量距離衰減系數(shù)、線性距離衰減系數(shù)、二次距離衰減系數(shù)分別設(shè)為
1,0,0ο(d)根據(jù)如下公式計(jì)算角度衰減因子anglejttenuation,angle_attenuation = smoothstep(cosPhi, cosTheta, dot(lightVector, IightDir))其中,cosPhi為衰減角度的余弦函數(shù)值,cosTheta為熱點(diǎn)角度的余弦函數(shù)值, IightVector為燈光矢量,IightDir為平行光的方向矢量。函數(shù) smoothst印、dot 都是 GLSL(OpenGL Shader Language)中的內(nèi)建函數(shù),可參考OpenGL手冊。(http //www. openRl. org/reRistry/doc/GLSLanRSpec. 1. 50. 11. pdf)對于點(diǎn)光源和平行光,分別將熱點(diǎn)角度的余弦函數(shù)值和衰減角度的余弦函數(shù)值設(shè)為-2,-3。(e)將步驟(b)中得到的光照顏色lightColor乘以步驟(c)和步驟(d)中得到的兩個(gè)衰減因子distance_attenuation、angle_attenuation即可得出最終的光照顏色 lightColor_end,公式如下lightColor_end = IightColor * distance_attenuation * angle_ attenuation。通過以上的計(jì)算過程可以看出,上面的光照計(jì)算步驟中是沒有任何條件分支,也就是說可以用統(tǒng)一的方法來計(jì)算不同種類光源的光照顏色,從而能夠大幅提高具有很多燈光的復(fù)雜三維場景的渲染中的渲染速度。顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其同等技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)。
權(quán)利要求
1.一種基于OpenGL核心模式的光源參數(shù)設(shè)定方法,包括如下步驟(1)輸入光源的環(huán)境光、漫反射光以及鏡面反射光的顏色;(2)判斷光源是否為平行光,如果是,設(shè)置光源的方向矢量;如果否,則設(shè)置光源的位置參數(shù);(3)對于平行光,設(shè)置光源方向混合系數(shù)為0;對于非平行光,設(shè)置光源方向混合系數(shù)為1 ;(4)對于非平行光,根據(jù)用戶指定的值對距離衰減因子的常量距離衰減系數(shù)、線性距離衰減系數(shù)、二次距離衰減系數(shù)進(jìn)行設(shè)置;對于平行光,將上述三個(gè)系數(shù)分別設(shè)為1,0,0 ;(5)判斷光源是否為聚光燈,如果是,計(jì)算角度衰減因子的熱點(diǎn)角度的余弦函數(shù)值、衰減角度的余弦函數(shù)值;如果否,則將上述兩個(gè)值分別設(shè)為_2,_3。
2.如權(quán)利要求1所述的基于OpenGL核心模式的光源參數(shù)設(shè)定方法,其特征在于步驟 (2)中,所述的光源的方向矢量就是指平行光的逆方向;所述的光源的位置參數(shù)就是指點(diǎn)光源或聚光燈光源的位置坐標(biāo)。
3.一種基于OpenGL核心模式計(jì)算光照顏色的方法,包括如下步驟(a)根據(jù)當(dāng)前像素的空間位置計(jì)算出與光源位置所構(gòu)成的矢量,記為燈光矢量;然后計(jì)算出這個(gè)矢量的模即為當(dāng)前像素所表示的點(diǎn)與光源的距離;(b)根據(jù)光源的顏色以及燈光矢量利用標(biāo)準(zhǔn)公式計(jì)算出該像素的漫反射顏色與鏡面反射顏色,其和值記為光照顏色;(c)根據(jù)如下公式計(jì)算距離衰減因子distance_attenuation,distance_attenuation = 1/(constantAttenuation+linearAttenuationXIightDis tance+quadraticAttenuation XIightDistanceXIightDistance)constantAttenuation mi^MMWlMWi, IinearAttenuation ^^ 減系數(shù),quadraticAttenuation為二次距離衰減系數(shù),IightDistance為當(dāng)前像素所表示的點(diǎn)與光源的距離,對于平行光,常量距離衰減系數(shù)、線性距離衰減系數(shù)、二次距離衰減系數(shù)分別設(shè)為1,0,O ;(d)根據(jù)如下公式計(jì)算角度衰減因子anglejttenuation,angle_attenuation = smoothstep(cosPhi, cosTheta,dot (lightVector,IightDir))其中,cosPhi為衰減角度的余弦函數(shù)值,cosTheta為熱點(diǎn)角度的余弦函數(shù)值, IightVector為燈光矢量,IightDir為平行光的方向矢量,函數(shù)smoothstep、dot都是 OpenGL Shader Language 中的內(nèi)建函數(shù),對于點(diǎn)光源和平行光,分別將熱點(diǎn)角度的余弦函數(shù)值和衰減角度的余弦函數(shù)值設(shè)為-2,-3 ;(e)將步驟(b)中得到的光照顏色乘以步驟(c)和步驟(d)中得到的兩個(gè)衰減因子即可得出最終的光照顏色。
4.如權(quán)利要求3所述的基于OpenGL核心模式計(jì)算光照顏色的方法,其特征在于在步驟(a)中,還包括通過如下公式對燈光矢量進(jìn)行修正的操作,lightVector = mix(IightDir, Normalize(lightVector), IightDirMixFactor)其中,lightVector為燈光矢量,IightDir為平行光的方向矢量,IightDirMixFactor光源方向混合系數(shù),函數(shù)Normalize是指計(jì)算一個(gè)向量所對應(yīng)的單位向量, 對于平行光,光源方向混合系數(shù)為0,其它燈光的光源方向混合系數(shù)為1。
全文摘要
本發(fā)明涉及視頻圖像處理技術(shù),具體涉及一種基于OpenGL核心模式的光源參數(shù)設(shè)定及計(jì)算光照顏色的方法。該方法針對點(diǎn)光源、平行光和聚光燈這三種常見類型的光源,通過設(shè)置其在于OpenGL核心模式中的相關(guān)參數(shù),使得在根據(jù)每個(gè)燈光的類型來動(dòng)態(tài)地渲染像素的光照顏色時(shí),不出現(xiàn)條件分支指令執(zhí)行的情況,從而大幅的提高了多燈光的復(fù)雜三維場景中的渲染速度。
文檔編號G06T19/20GK102542612SQ20101060764
公開日2012年7月4日 申請日期2010年12月27日 優(yōu)先權(quán)日2010年12月27日
發(fā)明者劉鐵華, 見良, 許小飛, 鄭鵬程 申請人:新奧特(北京)視頻技術(shù)有限公司