C#.net+OpenGL三维系统开发篇

来源:互联网 发布:联想电池修复软件 编辑:程序博客网 时间:2024/05/16 17:24

首先我们需要明确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封装上来的。今天就到此为止了,我赶紧回头完成我的开发工作了。