1. 程式人生 > >C#.net+OpenGL三維繫統開發篇

C#.net+OpenGL三維繫統開發篇

首先我們需要明確OpenGL是什麼,能幹什麼?現在依然記得有人曾經問起OpenGL和3dMax有什麼區別,更有甚者在一個三維開發QQ群中竟然有人這樣抱怨:“OpenGL搞了半天,才畫出來這麼個小東西,和3dmax比差太遠了,真搞不懂‘老闆’為什麼要搞OpenGL,而不直接用3dmax”。實際上我們只要搞明白OpenGL是什麼,能幹什麼就會馬上明白以上問題太不應該問了。

        OpenGL起初是SGI公司為了方便廣大開發人員開發三維圖形而寫好的三維應用程式介面(API),還是用俗話說吧,那就是一些寫好的大約250左右個C語言函式,你可以直接呼叫它的圖形函式,底層會自動響應命令滿足你的需求,比如當你呼叫如下命令函式:

glBegin(GL_Line);//開始繪製線

glVertex3d(0,0,0);//起點

glVertex3d(1,1,1);//終點

glEnd();//結束繪製

OpenGL引擎會為你畫一條從點(0,0,0)到點(1,1,1)的線段。

現在你應該明白OpenGL和3dmax的區別了吧?OpenGL是個圖形函式庫,而3dmax只是個三維軟體而已,使用OpenGL可以做出來個3dmax,使用3dmax肯定做不出來OpenGL。那麼OpenGL用來做什麼呢,用途太廣泛了,幾乎遍佈各個角落,從遊戲開發的科學研究。最簡單舉個例子:如果你想追mm,那麼你肯定要迫切知道她現在在什麼地方,怎麼做呢?在她身上安裝個定位裝置,實時將其座標資訊傳輸到你的計算機,獲取到座標資訊後,利用OpenGL模擬出來,這樣你就可以直接在你的電腦上實時將她的行蹤模擬出來了。

             OpenGL效能卓越的影象庫使其成為世界工業標準,具有跨平臺性。比較流行的三維引擎除了OpenGL還有微軟的在windows平臺上執行的DirectX。現今的大多三維軟體甚至三維開發包基本上都是基於以上兩種引擎的。以上兩種API皆提供C語言介面,所以用c/c++語言進行開發是此類驅動的最直接開發方法。然而有些人可能覺得c/c++叫底層,而且相對複雜,能不能使用c#呢?答案是肯定的。C#.net是微軟的新一代開發語言,其方便性給開發者帶來很大的吸引力。C#.netcom技術和net技術使其具有跨語言特性,通過com技術C#.net可以輕鬆地呼叫由各種語言封裝好的com元件。CSGL

正是經過簡單的介面轉換技術對OpenGL進行介面轉換使其直接支援C#.net(據我現在的理解,這個轉換並沒有使用com轉換,而是dll語言相關轉換,dll並不一定全是com),同時XNA也是由DirectX發展起來的直接支援C#.netDirectX介面。

如下是使用CSGL的具體步驟和方法:

1C# 直接呼叫 OpenGL

如前所述,OpenGL所提供的函式均為C介面的API形式,用C#訪問則需要進行類似混合語言程式設計過程的DLL呼叫,即呼叫OPENGL32.DLLGLU32.DLL以及GLUT32.DLL等。將這些檔案拷貝到應用程式目錄或windowssystem32目錄下,然後通過整合開發環境(IDE,本文使用visul studio 2005(VS2005))新建一個OpenGL呼叫類,如下MyGL類和MyGLU類分別直接呼叫OpenGL32.DLLGLU32.DLL:

using System.Runtime.InteropServices;

public class MyGL

{

//OpenGL常量宣告

public const uint GL_COLOR_ BUFFER_ BIT = 0x00004000;

public const uint   GL_MODELVIEW = 0x1700;

public const uint   GL_PROJECTION =0x1701;

……  ……

//函式入口宣告

[DllImport("opengl32.dll")]

public static extern void glClear(uint mask);

[DllImport("opengl32.dll")]

public static extern void glBegin(uint mode);
……
  ……

}

public class MyGLU

{

//OpenGL常量與函式入口宣告                

……  ……

}

  然而OpenGL提供約有250個左右不同的函式,還不包括GLUT等常用的工具庫和大量如上所述的OpenGL常量,所以若要在C#中進行DLL呼叫,可想而知其工作量將是非常大的。所以這種方式雖然直接,但相對以下所述的兩種方式較為繁瑣,所以在實際運用中少見。

2、藉助CSGL實現

如上文所述,C#可以呼叫OpenGL介面但是必須要首先通過介面轉換,其工作量相對繁瑣,而CSGL正好為我們做了以上的全部工作,所以我們可以利用C#直接呼叫CSGL完成OpenGL的全部功能,呼叫的函式介面名稱和型別與OpenGL完全一致,所以熟悉OpenGL的程式設計人員可迅速進行CSGL程式設計,而與使用哪種語言無關。

CSGL只包括csgl.dllcsgl.native.dll兩個檔案,將其拷貝到同一個目錄中(建議拷貝到應用程式目錄下),確保兩個檔案處於同一個目錄,然後新增引用,引入csgl.dll檔案,然後引入名稱空間: using CsGL.OpenGL 即可進行OpenGL開發。

VS2005中首先新增自定義OpenGL控制元件如下,在使用之前必須首先對glDraw,InitGLContext,OnSizeChanged三個函式進行重構。

class CSGLControl : OpenGLControl

{

public override void glDraw()

{

  base.glDraw();

/* OpenGL初始化,如glEnable(GL_BLEND); */

GL.glBegin(GLenum mode);

//Draw Your Images Here

GL.glEnd();

}

protected override void InitGLContext()

{

   base.InitGLContext();

/*繪製環境初始化,如GL.glShadeModel(GL.GL_SMOOTH); */

}

protected override void OnSizeChanged (EventArgs e)

{

    base.OnSizeChanged(e);

/* 視窗大小變化時呼叫,如GL.glViewport(0, 0, this.Width, this.Height); */

}

}

重新生成後工具欄出現CSGLControl,用滑鼠拖拽到窗體上即可進行控制元件式開發,在glDraw中進行繪圖操作,在InitGlContext中設定投影方式和初始環境,在OnSizeChanged中當視窗大小改變時進行投影檢視重新設定等操作。

好了現在你可以進入C#+OpenGL的開發了,我用完OpenGL很長時間了,實際上我們正在使用比OpenGL更方便的類庫,不過也是從OpenGL封裝上來的。今天就到此為止了,我趕緊回頭完成我的開發工作了。