唐憲郡
摘要:在計(jì)算機(jī)圖像處理中,基于圖像渲染速度問題,主要與
CPU、GPU效率有關(guān),可以改進(jìn)OpenGL渲染流程,根據(jù)GPU和CPU實(shí)際情況,優(yōu)化分配繪圖、渲染任務(wù),不僅能夠優(yōu)化圖像處理速度,還可以實(shí)現(xiàn)圖像渲染加速。以下本篇針對(duì)OpenGL圖像渲染加速方法,進(jìn)行實(shí)驗(yàn)研究。
關(guān)鍵詞:圖像渲染 OpenGL 渲染速度
1 OpenGL簡(jiǎn)介
OpenGL是一個(gè)跨平臺(tái)的圖形庫(kù),可在Windows、Unix、Mac等平臺(tái)上運(yùn)行。本書主要介紹怎樣在Windows平臺(tái)上建立OpenGL程序,并以Visual C++ 6.0編程環(huán)境為例來(lái)說(shuō)明整個(gè)編程環(huán)境的建立和設(shè)置[1]。OpenGL指令模式,也就是在C/S(CIient/Server,客戶/服務(wù)器)模型之中,通常可以根據(jù)用戶程序中(客戶)發(fā)出的命令,將其提交給相應(yīng)內(nèi)核程序中的(服務(wù)器),內(nèi)核服務(wù)器再對(duì)收到的不同指令進(jìn)行相應(yīng)的解釋,并在進(jìn)行初步處理之后,將其交給操作系統(tǒng)服務(wù)管理,然后再轉(zhuǎn)交給硬件進(jìn)行計(jì)算加速。
2 OpenGL圖像渲染流程
對(duì)于實(shí)際中的OpenGL指令,主要是集封裝在庫(kù)以及共享程序集之中的,可以當(dāng)應(yīng)用程序發(fā)出的OpenGL命令,以此來(lái)調(diào)用庫(kù)處理文件。然后,可以傳遞服務(wù)到內(nèi)核處理。其工作流程如下圖所示:
圖1 OpenGL工作流程
應(yīng)用程序OpenGL內(nèi)核服務(wù)顯示器顯示卡顯卡驅(qū)動(dòng)操作系統(tǒng)服務(wù)包含OpenGL指令OpenGL指令集(Windows上以DLL形式存在)OpenGL圖像渲染中,具有超強(qiáng)圖形繪制的能力,主要包括繪制物體指令、啟動(dòng)光照指令、管理位圖指令、圖像紋理映射指令、動(dòng)畫指令,還與圖像實(shí)現(xiàn)交互,發(fā)揮實(shí)際功能[2]。對(duì)于OpenGL渲染中,首先可以將物體轉(zhuǎn)化成可以描述的物體,使其形成具有集合性質(zhì)的頂點(diǎn)(Vertex),以及形成可以描述圖像性質(zhì)的像素(Pixel),并能夠在執(zhí)行一系列的操作之后,最終把這些數(shù)據(jù)轉(zhuǎn)化成相應(yīng)的像素?cái)?shù)據(jù)。
3 分析研究OpenGL圖像渲染加速試驗(yàn)
3.1 試驗(yàn)環(huán)境
可以在windows操作系統(tǒng)之下,對(duì)OpenGL應(yīng)用程序指令,主要就是被封裝在OpenGL32.dll庫(kù)以及Glu32.dl動(dòng)態(tài)鏈接庫(kù)中。其中,Glut庫(kù)作為OpenGL圖像渲染過程中的實(shí)用工具包,是一個(gè)可以獨(dú)立于子窗口的系統(tǒng)工具包,在OpenGL可以發(fā)揮隱藏特性,能夠以此來(lái)隱藏不同窗口系統(tǒng)的API復(fù)雜性。實(shí)際應(yīng)用中,Glu只封裝基礎(chǔ)API窗口,只是用于OpenGL的教學(xué)演示。在應(yīng)用中,可以在文件首部中添加頭文件:
# include “ gl \ gl.h”
# include “gl \ glu.h”
然后,可以打開菜單Project\Settings選型,隨后可以在彈出的對(duì)話框中,選擇Link 的標(biāo)簽,并在Object\Library Modules 欄,可以增加OpenGL32.lib 及glu32.lib 兩個(gè)庫(kù)文件。
3.2 像素格式設(shè)置
對(duì)于OpenGL圖像渲染過程中,對(duì)其進(jìn)行繪圖操作指示, OpenGL可以將數(shù)據(jù)轉(zhuǎn)化為像素,使其可以寫入幀中進(jìn)行緩存。因此在OpenGL圖像渲染中,OpenGL只需要知道像素格式,就可以在初始化OpenGL時(shí),根據(jù)PIXELFORMATDESCRIPTOR函數(shù),設(shè)置像素的屬性格式。
3.3 設(shè)置渲染描述表
對(duì)于OpenGL渲染加速中,應(yīng)用描述表來(lái)表示輸出同Windows設(shè)備的聯(lián)系機(jī)制,可以把OpenGL圖像渲染信息存入描述表,在Windows系統(tǒng)中,更新OpenGL中一個(gè)窗口圖形的狀態(tài)[3]。利用“MFC ClassWizard”,使CMFCOpenGLExplView類響應(yīng)WM_CREATE、WM_SIZE、WM_ERASEBKGND、WM_DESTROY、WM_LBUTTONDOWN、WM_RBUTTONDOWN、和WM_TIMER這7個(gè)消息,得到相應(yīng)的7個(gè)消息響應(yīng)函數(shù)。
3.4 繪制圖像
在OnDraw()函數(shù)中調(diào)用成員函數(shù)RenderScene()來(lái)繪制場(chǎng)景,該函數(shù)體其實(shí)就是ConsoleExpl工程中display()的函數(shù)體。
void CMFCOpenGLExplView::OnDraw(CDC* pDC)
{CMFCOpenGLExplDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
RenderScene();}
void CMFCOpenGLExplView::RenderScene()
{gl Clear ( GL_COLOR_ BUFFER_BIT | GL_ DEPTH_BUFFER_BIT );
glPushMatrix();//保存模型視圖矩陣
glRotatef(m_rotAngle, 0.0, 0.0, 1.0);
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0,0.0);
glVertex2f(0.0, -25.0);
glColor3f(0.0, 1.0, 0.0);
glVertex2f(25.0, -12.5);
glColor3f(0.0, 0.0, 1.0);
glVertex2f(25.0, 12.5);
glColor3f(1.0, 1.0, 0.0);
glVertex2f(0, 25.0);
glColor3f(1.0, 0.0, 1.0);
glVertex2f(-25.0, 12.5);
glColor3f(0.0, 1.0, 1.0);
glVertex2f(-25.0, -12.5);
glEnd();
glPopMatrix();//恢復(fù)模型視圖矩陣
SwapBuffers(wglGetCurrentDC());//交換緩沖區(qū)}
繪制出結(jié)果,并且基于整個(gè)處理過程中,都可以確保在計(jì)算機(jī)的后臺(tái)模式下完成,并且只需要程序員開發(fā)應(yīng)用程序部分,基本上后續(xù)工作則不需要程序員參與,對(duì)于硬件的管理工作也可以交由計(jì)算機(jī)完成,具有實(shí)際應(yīng)用價(jià)值。
4 結(jié)論
綜上所述,實(shí)驗(yàn)研究證實(shí),在基于OpenGL圖像渲染基礎(chǔ)上,應(yīng)用OpenGL,有效實(shí)現(xiàn)圖像渲染加速,優(yōu)化圖像渲染流程,值得在實(shí)際中應(yīng)用推廣。
參考文獻(xiàn):
[1]喬少杰,王有為.基于OpenGL的快速圖像渲染方法[J].計(jì)算機(jī)應(yīng)用研究,2008,5(5):1589-1595.
[2]蘇國(guó)中.OpenGL模擬攝影測(cè)量方法研究[J].中國(guó)圖像圖形學(xué)報(bào),2006(04).
[3]向世明.OpenGL 編程與實(shí)例[M].北京:電子工業(yè)出版社,1999:22-82.