仲蘭芬
(包頭師范學(xué)院數(shù)學(xué)科學(xué)學(xué)院,內(nèi)蒙古包頭014030)
在VS2008中開(kāi)發(fā)和移動(dòng)OpenGl程序的方法*
仲蘭芬
(包頭師范學(xué)院數(shù)學(xué)科學(xué)學(xué)院,內(nèi)蒙古包頭014030)
以VS2008為例,說(shuō)明了.NET環(huán)境下使用OpenGL開(kāi)發(fā)應(yīng)用程序的技術(shù)方法,并進(jìn)一步說(shuō)明了如何通過(guò)控件PictureBox簡(jiǎn)化程序界面設(shè)計(jì)。還介紹了如何將VC++環(huán)境下的OpenGL程序移動(dòng)到.NET壞境下的方法和注意事項(xiàng)。
OpenGL;.NET;csgl動(dòng)態(tài)鏈接庫(kù)文件;繪制環(huán)境
OpenGL(Open Graphics Library)是圖形硬件的一個(gè)軟件接口,是一種快速、高質(zhì)量的3D圖形軟件。它提供了近120個(gè)繪制點(diǎn)、線和多邊形等3D圖形的命令,可以完成繪制物體、變換、光照處理、著色、反走樣、融合、霧化、位圖和圖像、紋理映射、動(dòng)畫等基本操作,通過(guò)把這一系列基本操作進(jìn)行組合,可以構(gòu)造更復(fù)雜的3D物體和描繪豐富多彩、千變?nèi)f化的客觀世界[1]。在C++環(huán)境中實(shí)現(xiàn)OpenGL的技術(shù)已經(jīng)非常成熟,其中OpenGL與Visual C++6.0結(jié)合的開(kāi)發(fā)比較多。.NET系列的開(kāi)發(fā)平臺(tái)具有語(yǔ)法更加簡(jiǎn)潔,調(diào)試更加容易,且應(yīng)用程序開(kāi)發(fā)更加快速,尤其是界面設(shè)計(jì)較Visual C++6.0更豐富,高效,簡(jiǎn)單的特點(diǎn)。而在.NET framework中沒(méi)有提供Open-GL API的接口,在文獻(xiàn)[1][2]中敘述了.NET環(huán)境下利用OpenGL庫(kù)開(kāi)發(fā)程序的基本步驟和方法。本文以Visual Studio C#2008.net(VS2008)開(kāi)發(fā)平臺(tái)為例,更加詳細(xì)說(shuō)明了使用OpenGL API的技術(shù)方法,并介紹將Visual C++6.0(VS6.0)平臺(tái)下的利用OpenGL圖形庫(kù)開(kāi)發(fā)的程序移植到.NET平臺(tái)下的方法,方便開(kāi)發(fā)人員升級(jí)程序。
2.1 建立對(duì)OpenGL庫(kù)的引用
在.Net framework中沒(méi)有提供OpenGL ApI托管接口,第三方軟件CSGL[3]提供了新的OpenGL動(dòng)態(tài)鏈接庫(kù)文件csgl-opengl.dll(包括csgl.dll和csglnative.dll兩個(gè)文件),在C#中通過(guò)調(diào)用這個(gè)文件,就可以實(shí)現(xiàn)OpenGL所提供的強(qiáng)大的圖形繪制功能。CSGL的下載地址http://sourceforge.net/projects/csgl/files/,相關(guān)內(nèi)容的中文的學(xué)習(xí)網(wǎng)站有http:// blog.sina.com.cn/s/blog_4b94ff130100evua.html等。下載后把csgl-opengl.dll復(fù)制到c:windowssystem32下,在Microsoft Visual Studio C#2008中建立一個(gè)Windows應(yīng)用程序項(xiàng)目,在該項(xiàng)目Reference里將csgl-opengl.dll添加引用。在將要建立的程序命名空間中添加using CsGL.OpenGL后就完成對(duì)OpenGL庫(kù)的引用,可以使用庫(kù)中的函數(shù)進(jìn)行繪圖了。
2.2 初始化OPenGL繪圖環(huán)境
在VS2008中生成一個(gè)Windows應(yīng)用程序時(shí),應(yīng)用程序向?qū)?huì)生成表單類(Form1),該表單類窗體就是應(yīng)用程序的繪制表面,但是由于OpenGL需要使用自己的特殊繪制環(huán)境,所以還需要生成一個(gè)繪制環(huán)境類。該類需從CsGL.OpenGL.OpenGLControl類派生,因?yàn)镺penGLControl類中定義了設(shè)備初始化函數(shù)InitGLContext、場(chǎng)景繪制函數(shù)glDraw、雙緩存交換函數(shù)SwapBuffers以及窗口大小改變時(shí)的重繪函數(shù)OnSizeChanged等初始化函數(shù),詳細(xì)的設(shè)計(jì)步驟可參閱文獻(xiàn)[1,2,3],在此補(bǔ)充屏幕刷新和鍵盤控制的內(nèi)容。
在VS2008中建立Windows應(yīng)用程序,并自定義類OpenglView類,基類為CsGL.OpenGL.OpenGLControl,用于建立OpenGL繪圖環(huán)境。除了使用函數(shù)InitGLContext、glDraw和OnSizeChanged完成繪制環(huán)境的初始化外[2],使用下面的方法實(shí)現(xiàn)窗口刷新和鍵盤控制。
屏幕刷新方法:
(1)在OpenglView類中創(chuàng)建一個(gè)窗口重繪計(jì)時(shí)器對(duì)象:
(2)在OpenglView類的構(gòu)造函數(shù)中初始化計(jì)時(shí)器:
(3)創(chuàng)建窗口重繪計(jì)時(shí)器回調(diào)函數(shù),每10ms刷新一次OpenGL窗口。
鍵盤控制方法:
(1)在OpenglView類中創(chuàng)建按鍵響應(yīng)回調(diào)函數(shù)。
(2)修改表單屬性Form1.KeyPreview=TRUE,確定窗體上的鍵盤控件事件已經(jīng)向窗體注冊(cè)。并初始化窗體鍵盤事件的回調(diào)函數(shù),代碼如下。
2.3 簡(jiǎn)化界面設(shè)計(jì)
在Visual C++6.0環(huán)境下開(kāi)發(fā)程序的人共有的經(jīng)驗(yàn)是該平臺(tái)的界面設(shè)計(jì)較復(fù)雜,再加上OpenGL API的使用有其特殊的繪制環(huán)境要求,比如,要求特殊的像素格式、渲染上下文和雙緩存機(jī)制等,使得程序員將過(guò)多的精力放在界面設(shè)計(jì)和OpenGL繪圖環(huán)境的創(chuàng)建上,從而產(chǎn)生使用OpenGL API很困難的感覺(jué)。
圖1:使用PictureBox作為顯示表面
在CsGL.OpenGL.OpenGLControl類中定義了創(chuàng)建繪制環(huán)境的函數(shù),一般無(wú)需重寫這個(gè)函數(shù)就能夠完成OpenGL繪制環(huán)境的創(chuàng)建任務(wù),所以在VS2008平臺(tái)上僅需要考慮如何初始化繪制環(huán)境[參見(jiàn)本文2.2]。另外該平臺(tái)界面設(shè)計(jì)簡(jiǎn)單,所見(jiàn)即所得,可大大提高開(kāi)發(fā)效率。需要注意的是:一般不直接使用OpenglView類中的Form1對(duì)象作為繪制表面,而是在Form1上添加PictureBox作為OpenGL繪制環(huán)境的繪制表面,這樣方便多樣化界面的設(shè)計(jì)。例如圖1,在Form1上添加控件PicturBox(pictureBox1)和Button(button1)后,設(shè)計(jì)button1的單擊事件代碼如下:
圖2為作者設(shè)計(jì)的一個(gè)軟件界面圖,表單中創(chuàng)建了3個(gè)PictureBox控件,作為OpenGL的繪制表面。
圖2:使用多個(gè)PictureBox的界面
將在VS6.0下開(kāi)發(fā)的程序移動(dòng)到VS2008的平臺(tái)上修改的話,需要注意的問(wèn)題有三個(gè)方面。首先對(duì)OpenGL繪圖環(huán)境的設(shè)置需要“對(duì)號(hào)入座”,并且對(duì)CsGL.OpenGL.OpenGLControl已經(jīng)完成的初始化部分不再重復(fù)設(shè)置。還有就是需要將所有調(diào)用的OpenGL函數(shù)名和常量參數(shù)前要添加GL進(jìn)行限定[1]。最后,就是由于C#的類型檢查機(jī)制嚴(yán)格,需要修改VS6.0下代碼中使用指針的內(nèi)容。以下以VS6.0中基于單文檔的OpenGL程序?yàn)槔敿?xì)說(shuō)明代碼的移動(dòng)過(guò)程。如圖3。
圖3:代碼移動(dòng)
在單文檔中繪制OpenGL圖形,需要在單文檔窗口的創(chuàng)建過(guò)程中設(shè)置OpenGL要求的像素格式,窗口屬性風(fēng)格和設(shè)備描述表,及在單文檔視圖類函數(shù)OnCreate()(圖3①)中完成創(chuàng)建OpenGL繪圖設(shè)備環(huán)境的工作。在VS2008中在CsGL.OpenGL. OpenGLControl類中定義了創(chuàng)建繪圖環(huán)境的函數(shù),所以O(shè)nCreate()中的代碼無(wú)需移動(dòng)。需要移動(dòng)的就是繪制環(huán)境初始化和繪制代碼。對(duì)于燈光、材質(zhì)和紋理等(圖3④)的初始化可移動(dòng)到OpenglView.Init-GLContext()函數(shù);對(duì)于窗口縮放時(shí)圖形變換的設(shè)置及單文檔視圖類OnSize()(圖3③)函數(shù)中的代碼可移動(dòng)到OpenglView.OnSizeChanged()函數(shù)中;單文檔視圖類OnDraw()(圖3②)中繪圖代碼對(duì)應(yīng)移動(dòng)到OpenglView.glDraw()中。
以上介紹了VS2008平臺(tái)上使用OpenGL圖形庫(kù)開(kāi)發(fā)程序的技術(shù)方法,和將已有的VS6.0平臺(tái)下的OpenGL程序移動(dòng)到VS2008平臺(tái)的基本方法和注意事項(xiàng)?;贑#語(yǔ)言和VS2008平臺(tái)的優(yōu)良特性,OpenGL命令的使用將更為簡(jiǎn)潔和高效。
[1]王家華,李憲.C#開(kāi)發(fā)OpenGL的圖形繪制方法研究[J].現(xiàn)代電子技術(shù),2007,24.
[2]高明向,陳定.OpenGL建模技術(shù)在C#中的實(shí)現(xiàn)[J].武漢理工大學(xué)學(xué)報(bào),2005,7(1):65-68.
[3]潘敏,何宗斌.在C#中結(jié)合OpenGL實(shí)現(xiàn)MIT-MTT套損檢測(cè)三維成像軟件開(kāi)發(fā)[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2013,6.
Programing and Transplanting Programs with VS2008 and OpenGL
ZHONG Lan-Fen
(Department of Mathematics,Baotou Teachers College;Baotou 014030)
We illustrate how to program with.NET and OpenGL,and how to simplify a software interface designing with the PictureBox being added in the interface,als show the method about transplanting a program form VC+ +programing enviroment to.NET envirmment All sample programs in this paper is edited on VS2008.
OpenGL;NET;csgl Dynamic_link library file;Device Context
TP311
A
1004-1869(2014)01-0040-04
2013-12-17
內(nèi)蒙古自治區(qū)自然科學(xué)基金項(xiàng)目(2011MS0901);內(nèi)蒙古高等學(xué)??茖W(xué)研究項(xiàng)目(NJZZ11142,NJZY12113)
仲蘭芬(1975-),女,內(nèi)蒙古巴彥淖爾人,碩士,副教授,研究方向:計(jì)算機(jī)圖形學(xué)。