杜麗美
(長(zhǎng)治學(xué)院 計(jì)算機(jī)系,山西 長(zhǎng)治 046011)
OpenGL在計(jì)算機(jī)圖形學(xué)中的應(yīng)用研究
杜麗美
(長(zhǎng)治學(xué)院 計(jì)算機(jī)系,山西 長(zhǎng)治 046011)
基于可視化的需求,研究在圖形學(xué)中如何生成具有真實(shí)感的圖形,主要引入了OpenGL函數(shù),利用OpenGL函數(shù)中的光照、材質(zhì)、霧化等函數(shù)對(duì)利用圖形學(xué)生成的三角網(wǎng)格模型進(jìn)行設(shè)置,以達(dá)到重建物體的目的。
計(jì)算機(jī)圖形學(xué);三角網(wǎng)狀模型;OpenGL函數(shù);光照;材質(zhì);霧化
計(jì)算機(jī)圖形學(xué)[1]是一種使用某種數(shù)學(xué)算法將二維或三維圖形以柵格的形式顯示在計(jì)算機(jī)顯示器上的科學(xué)。也就是說(shuō),計(jì)算機(jī)圖形學(xué)主要研究的是利用何種算法在計(jì)算機(jī)中表示圖形、以及進(jìn)行圖形的計(jì)算和處理。
計(jì)算機(jī)圖形學(xué)的一個(gè)主要的目的就是要在計(jì)算機(jī)屏幕上生成具有真實(shí)感的圖形。因此,應(yīng)首先建立物體的幾何表示,然后再將假想的光源、紋理、材質(zhì)、霧等屬性附于幾何圖形上,使得計(jì)算機(jī)屏幕上顯示的幾何圖形更加接近于真實(shí)物體。目前計(jì)算機(jī)圖形學(xué)往往和OpenGL一起使用[2]。
OpenGL實(shí)際上是一個(gè)豐富的三維圖形函數(shù)庫(kù),除了具有基本的OpenGL函數(shù)外,還支持其他四類函數(shù):OpenGL實(shí)用庫(kù)、OpenGL輔助庫(kù)、Windows專用庫(kù)函數(shù)、Win32 API函數(shù)[3-4]。OpenGL的這些函數(shù)有強(qiáng)大的功能,比如:可以繪制三維物體,可以對(duì)物體進(jìn)行光照、明暗處理、材質(zhì)設(shè)置、紋理設(shè)置、霧化等效果。此外OpenGL還提供了雙緩存,可以用來(lái)制作動(dòng)畫。OpenGL的這些強(qiáng)大的功能為實(shí)現(xiàn)三維物體重建技術(shù)、以及建立人機(jī)交互的三維場(chǎng)景提供了堅(jiān)實(shí)的基礎(chǔ)。
OpenGL不僅可以運(yùn)行在各種流行的操作系統(tǒng)上,而且只要在基本的C或C++語(yǔ)言中調(diào)用相應(yīng)的函數(shù)即可。
計(jì)算機(jī)圖形學(xué)結(jié)合OpenGL函數(shù)渲染繪制出真實(shí)物體的三維圖形的基本步驟如下:
(1)建立基本模型。首先利用計(jì)算機(jī)圖形學(xué)中的算法將真實(shí)物體轉(zhuǎn)化成能在計(jì)算機(jī)上表示的景物模型,復(fù)雜物體一般是表示成三角網(wǎng)狀的模型結(jié)構(gòu)。
(2)投影及視口變換。把表示出的模型放在三維空間中的合適的位置,并且設(shè)置視點(diǎn)(viewpoint),使得模型居中顯示并且將觀察者感興趣的一面展現(xiàn)在屏幕上。
(3)光照、材質(zhì)、霧等的設(shè)置。將模型展示在屏幕上以后,就開(kāi)始真正的模擬真實(shí)物體了,這里主要通過(guò)設(shè)置OpenGL中的光照、材質(zhì)、霧化函數(shù)來(lái)對(duì)真實(shí)物體進(jìn)行模擬。
(4)顯示三維圖形。
對(duì)于現(xiàn)實(shí)生活中的復(fù)雜物體,要想將其顯示在計(jì)算機(jī)屏幕上,可以首先利用某種技術(shù)手段提取真實(shí)物體表面的離散點(diǎn),然后將這些離散點(diǎn)輸入到計(jì)算機(jī)中,最后利用某種有效的算法將這些點(diǎn)聯(lián)系起來(lái)構(gòu)成三角網(wǎng)格的形式,最終在計(jì)算機(jī)屏幕上得到描述真實(shí)物體的三角網(wǎng)格模型。圖3-1便是真實(shí)物體對(duì)應(yīng)的三角網(wǎng)格模型
圖3-1 三角網(wǎng)格模型Fig 3-1 The example of the triangul ation
建立好的模型如何在計(jì)算機(jī)屏幕上顯示是關(guān)鍵,比如要顯示在屏幕上的哪個(gè)位置、是否要按比例顯示,這些問(wèn)題都會(huì)影響真實(shí)物體的重建的效果,在OpenGL函數(shù)中主要提供了兩種投影方式[5]:正射投影和透視投影。
(1)正射投影的視景體類似一個(gè)長(zhǎng)方體,因此在投影的過(guò)程中無(wú)論物體距鏡頭是近的還是遠(yuǎn)的,但最終投影到屏幕上的物體尺寸是不變的。正射投影函數(shù)為:
函數(shù)中的參數(shù)表示了兩個(gè)裁剪平面,即近裁剪面和遠(yuǎn)裁剪面,這兩個(gè)裁剪面都是長(zhǎng)方形,而且函數(shù)中的參數(shù)表明近裁剪面所對(duì)應(yīng)的長(zhǎng)方形的左下角點(diǎn)和右上角點(diǎn)坐標(biāo)分別是(left,bottom,-near)和(right,top,-near);而遠(yuǎn)裁剪面所對(duì)的長(zhǎng)方形的左下角點(diǎn)和右上角點(diǎn)坐標(biāo)分別是(left,bottom,-far)和(right,top,-far)。
(2)透視投影的視景體類似一個(gè)棱臺(tái),它的特點(diǎn)是離視點(diǎn)近的物體大,離視點(diǎn)遠(yuǎn)的物體小。這種投影方式經(jīng)常用在三維場(chǎng)景的模擬以及動(dòng)畫等需要反應(yīng)真實(shí)性事件的情況中。此種投影方式所對(duì)的函數(shù)為:
這個(gè)函數(shù)的參數(shù)只定義近裁剪平面的坐標(biāo),即左下角點(diǎn)和右上角點(diǎn)的坐標(biāo)分別為(left,bottom,-near)和(right,top,-near);遠(yuǎn)裁剪平面沒(méi)有定義具體的坐標(biāo),只是定義了一個(gè)參數(shù)far,這個(gè)參數(shù)反應(yīng)了透視投影的特點(diǎn),far的大小表明遠(yuǎn)裁剪平面距離鏡頭的遠(yuǎn)近,而其對(duì)應(yīng)的坐標(biāo)是由系統(tǒng)自動(dòng)生成的。
正射投影和透視投影只是采用什么樣的視景體來(lái)截取圖像,并不負(fù)責(zé)使用某種規(guī)則把圖像呈現(xiàn)在屏幕上,glViewport()函數(shù)主要是用來(lái)把由視景體截取的圖像按照怎樣的高和寬顯示在屏幕上。對(duì)應(yīng)的函數(shù)為:
此函數(shù)中4個(gè)參數(shù)決定了視口的位置:視口的左下角點(diǎn)坐標(biāo)為(x,y),右上角點(diǎn)坐標(biāo)為(x+width,y+height)。
首先對(duì)模型進(jìn)行光照設(shè)置[5-6]。一般來(lái)說(shuō),光照設(shè)置包括三種光:環(huán)境光、漫反射光和鏡面反射光。環(huán)境光(Ambient Light)可以來(lái)自地面、天空、墻壁等;漫反射光(Diffuse Light)表示某種給定的光源照射到物體表面后并均勻向四周反射出去的光;鏡面反射光(Specular Light)為朝向特定方向反射出去的光。
OpenGL中的光照函數(shù)見(jiàn)下:
創(chuàng)建光源位置:glLightfv(GL_LIGHT0,GL_POSITION,light_position)
定義三種光:
以上函數(shù)中的第三個(gè)參數(shù)都是自定義的具體值,例如定義光源位置的具體值如下:
其次對(duì)模型進(jìn)行材質(zhì)的設(shè)置[5-6],和光源類似,材料顏色的成分也分為環(huán)境、漫反射和鏡面反射三種。通常在一個(gè)場(chǎng)景中同時(shí)設(shè)置光照和材質(zhì)兩種特性,這兩種特性同時(shí)作用在物體上時(shí),效果為兩者的疊加,即若光源顏色為(R1,G1,B1),材質(zhì)顏色為(R2,G2,B2),那么最終看到的效果為(R1*R2,G1*G2,B1*B2)。材質(zhì)的定義函數(shù)為:
其中face取GL_FRONT表明將材質(zhì)應(yīng)用到物體前面,取GL_BACK表明將材質(zhì)應(yīng)用到物體背面,取GL_FRONT_AND_BACK表明將材質(zhì)應(yīng)用到物體前后兩個(gè)面上;pname一般取GL_AMBIENT或GL_DIFFUSE或 GL_SPECULAR或 GL_SHINESS;第三個(gè)參數(shù)為第二個(gè)參數(shù)對(duì)應(yīng)的具體值。其中GL_SHINESS為鏡面指數(shù),也就是所謂的“高光區(qū)”的大小,此參數(shù)作用于模型上,可以使模型表面的制定位置處呈現(xiàn)一個(gè)光亮區(qū)域,使得模型更加接近于真實(shí)物體。
霧化的應(yīng)用極為廣泛,它的作用是使物體更加接近真實(shí)效果,而且也可以使物體看起來(lái)更加自然。因此將霧的效果應(yīng)用于模型上,可以給人產(chǎn)生距離感,使得模型更加具有立體感。此外,霧的濃度可以控制,霧的顏色也可以任意設(shè)定。
在OpenGL程序中啟動(dòng)霧以及控制霧的函數(shù)為[5]:
glEnable(GL_FOG)
glFogfv(GLenum pname,TYPE param)
其中參數(shù)pname通常取GL_FOG_MODE、GL_FOG_DENSITY、GL_FOG_START、GL_FOG_END 或GL_FOG_COLOR,param則取對(duì)應(yīng)的具體值。
經(jīng)過(guò)以上三個(gè)步驟就完成了對(duì)真實(shí)物體的模擬,通過(guò)調(diào)用相應(yīng)的輸出函數(shù)將模擬重建的物體顯示在計(jì)算機(jī)屏幕上。
本實(shí)驗(yàn)在VC6.0平臺(tái)上進(jìn)行,采集了海豚表面的離散點(diǎn),采用正射投影的方式對(duì)海豚進(jìn)行了模擬。
①圖4-1(a)為在計(jì)算機(jī)屏幕上生成的海豚的三角網(wǎng)格模型。
②圖4-1(b)為開(kāi)啟默認(rèn)光照后的效果,從圖中可以看出,對(duì)模型進(jìn)行光照后,背光的部分顏色較暗,非常接近現(xiàn)實(shí)生活,而且一個(gè)場(chǎng)景中的兩只海豚在同一光照條件下的顏色相同。
③圖4-1(c)是在開(kāi)啟默認(rèn)光照的基礎(chǔ)上,對(duì)模型進(jìn)行材質(zhì)的設(shè)置并且設(shè)置“高光區(qū)”,從圖中可見(jiàn),在同一場(chǎng)景中,不同的海豚可以設(shè)置不同的材質(zhì),再加上“高光”處理,使模型更加真實(shí)化。
④圖4-1(d)為在 4-1(c)的基礎(chǔ)上加上了霧的效果,使得遠(yuǎn)離視點(diǎn)的淡藍(lán)色海豚變得模糊,看起來(lái)生動(dòng)、形象。
圖4-1 海豚的模擬過(guò)程Fig4-1 The imitation of dolphin
文章主要針對(duì)OpenGL中的光照、材質(zhì)和霧化函數(shù)對(duì)模型進(jìn)行設(shè)置,并且顯示了逼真的三維渲染效果。此外,OpenGL函數(shù)還有更加強(qiáng)大的功能,比如進(jìn)行紋理設(shè)置、特殊光照處理還有實(shí)現(xiàn)動(dòng)畫效果等。
[1]趙玉峰.計(jì)算機(jī)圖形學(xué)的發(fā)展及應(yīng)用[J].科技信息,2008,(16):68.
[2]李文強(qiáng),華祖耀.基于OpenGL的仿真可視化技術(shù)研究[J].計(jì)算機(jī)仿真,2005,(06):158-161.
[3]歐中亞.基于OpenGL的三維建??梢暬浖_(kāi)發(fā)[J].信息安全與技術(shù),2011(07):48-50.
[4]湯彬.基于 OpenGL 實(shí)現(xiàn)三維繪圖[J].上海工程技術(shù)大學(xué)學(xué)報(bào),2002,(01):18-25.
[5]廖朵朵.OpenGL變換、光照、紋理、動(dòng)畫及特殊效果[J].微電腦世界,1996,(11):151-153.
[6]廖朵朵.OpenGL基本功能操作-建模、變換、顏色、光照與材質(zhì)[J]. 微電腦世界,1997,(01):75-78.
TP391.41
A
1673-2014(2012)02-0050-03
2012—02—22
杜麗美(1983—),女,山西大同人,碩士,主要研究計(jì)算機(jī)圖形學(xué)、圖像處理等研究。
(責(zé)任編輯 單麥琴)