|
最近一直在摸索在.NET环境下用C#语言结合OpenGL图形库来开发三维图形程序。在摸索的过程中发现,有关这方面的学习资料很少,网上能搜到的入门级例程都大同小异而且讲的含糊不清比较混乱。于是结合自己对CsGL的摸索和这段时间对.NET的学习,整理了如下资料,仅代表个人对这一技术的理解。不当之处还望各位漂客多多指教:)
首先,简单介绍一下CsGL——初学者不要把它看的很深奥,其实就是基于Windows 平台下的OpenGL
API接口封装的C#类库。CsGL的动态链接库文件共有两个csgl.dll和csgl.native.dll(可以在SF.NET上下载:http://csgl.sourceforge.net/)。其中程序编制过程中需在项目引用中加入csgl.dll,而csgl.native.dll在程序设计过程中用不到,但程序运行过程中是必需的。
csgl.dll中定义了4个名称空间:即CsGL,CsGL.OpenGL,CsGL.Pointers,CsGL.Util。对这四个命名空间所包含的功能简单总结如下:(有关这四个名称空间中各个类的详细介绍可参见SF.NET上的Manuals)
1、
CsGL空间中只定义了一个类OSLib,该类继承于.NET
Framework中的System.Object,主要用来检查库文件的版本信息和库函数是否存在等;
2、CsGL.OpenGL空间中定义了绝大部分OpenGL绘图函数相关的类,其中OpenGLControl中定义了OpenGL绘制环境创建及初始化函数等,OpenGL、
GL、
GLU、GLUT四个类中封装了几乎所有的OpenGL标准中的函数、用户库函数、辅助库函数和实用库函数以及常量等;
3、CsGL.Pointers空间中定义了各种数组或指针类型的数据类。
4、CsGL.Util空间中定义了响应键盘、鼠标操作、错误处理、屏显设置等相关的类。
为了能够使用csgl.dll和csgl.native.dll这2个库文件,可先将这2个文件拷贝到系统文件夹%system
root%\system 32中,然后在项目的属性页对话框中将“引用路径”设置为系统文件夹%system root%\system
32,这样C#就可以找到运行调试应用程序所需要的库文件;或者在需要使用OpenGL的项目中添加引用,浏览到存放csgl.dll文件的位置添加对该库文件的引用即可。
如果想在.NET环境下用C#语言开发的Windows程序中,使用OpenGL库函数进行图形绘制,必须首先建立用于绘制的设备环境,即绘制表面(或称为绘制区域)。而这一绘制表面的创建,在CsGL提供的C#类库中是通过定义一个控件类来实现的。定义的这个控件类可以理解为带有可视化表示形式的通用组件,就如同Button
类、Panel类等组件一样。CsGL中称其为“an OpenGL
view”(OpenGL视图),而所有的图形绘制和显示等操作都是在这类组件的一个实例上实现的。该类的定义由CsGL.OpenGL
名称空间中的OpenGLControl类来派生,而OpenGLControl类又继承自System.Windows.Forms.Control类。
假定定义的用于绘制图形的控件类名为“OpenGLView”,则该控件类即OpenGL视图类的定义如下:
classOpenGLView:OpenGLControl
{
///
/// 初始化绘图环境,包括设置颜色、光线、纹理、矩阵模式等
///
protected
override void InitGLContext()
{
base.InitGLContext();
GL.glClearColor(0.0f,
0.0f, 0.0f,
0.0f); // 设置OpenGl视图空间的背景色为黑色
GL.glMatrixMode(GL.GL_PROJECTION);
// 将变换矩阵模式设为投影变换
GL.glLoadIdentity();
// 加载投影变换单位矩阵重置视景体
// 用正射投影设置一个边长为20个单位的立方体兴视景体
GL.glOrtho(-10.0,
10.0, -10, 10.0, 0, 20);
//TODO: 可添加其他初始化动作
}
///
/// 设置视口(glViewport)大小
/// 视口(Viewport)——视景体(Viewing
Volume )投影后的图形就在视口内显示
/// Viewing
Volume & Viewport 的概念参见:
///http://jerome.jouvie.free.fr/OpenGl/Lessons/Lesson1.php#ViewingVolume
///
///
protected
override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
//
设置视口尺寸与视图类控件的尺寸相同
GL.glViewport(0,
0, this.Size.Width, this.Size.Height);
GL.glMatrixMode(GL.GL_MODELVIEW);
// 设置当前为模型视图矩阵
GL.glLoadIdentity();
//
重置模型视图矩阵
}
///
/// 绘制图形的功能最终都需通过执行glDraw()方法来实现,该方法默认由OnPaint()自动调用
///
public
override void glDraw()
{
GL.glColor3f(1.0, 0.0, 0.0);
// 设置当前绘图前景色为红色
GL.glLineWidth(2f);
//
设置当前线宽为2个单位
GL.glBegin(GL.GL_LINES);
//
开始绘制线段
{
GL.glVertex2i(-5, -5);
//
指定线段的起点
GL.glVertex2i(5, 5);
//
指定线段的终点
}
GL.glEnd();
// 结束线段的绘制
}
}
上面这段代码只是介绍了OpenGL视图类这个控件的定义过程,下面通过完整的创建一个在一个窗体上显示一段用OpenGL绘制的线段的Windows程序来演示实现这一技术的全过程。
第一步:先在Visual
Studio.NET环境中用C#创建一个Windows窗体应用程序,应用程序起名为“OpenGLStudy”。在引用中添加csgl.dll。
第二步:在该项目中添加一个类,类名为“OpenGLView”,将上面所列的OpenGLView类的定义代码加入该类中,并引入CsGL.OpenGL名称空间,如下:
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
CsGL.OpenGL;
namespace
TestDraw
{
classOpenGLView : OpenGLControl
{
///
如前所列类的定义代码段
}
}
在这步完成后,在工具箱中会出现一个名为OpenGLView的组件,即为定义并设置好了的用于绘制并显示图形的“OpenGL视图”类组件。
第三步:利用窗体设计器向Form1窗体中添加一个“OpenGLView”组件,其实例名默认为“OpenGLView1”,修改其Dock属性为Fill。
第四步:编译并运行,即可生成一个在黑色背景下绘制了一段红色线段的窗体,如下图所示。如果未能顺利显示出图形,可将窗口拖出桌面让部分窗口失效后再将其拖回便可显示——因为这一过程会引发OnPaint()方法,而OnPaint()方法又会调用OpenGLView.glDraw()方法完成图形的绘制。
至此,一个简单的利用OpenGL库函数绘制和显示图形的Windows程序已开发完成。如果需要改变绘制的图案,只需在OpenGLView.glDraw()方法中添加和修改代码即可。当然这仅仅是演示了利用OpenGL编程的最简单的功能,而且没有考虑到程序运行的效率性、完善性和容错性等。但即使这样也足以说明了利用CsGL封装的OpenGL开发程序的全过程和总体思路,至于其它的细节可以随着学习的深入一步一步的探究、追加。
希望上面这些心得对看了的人有所帮助,同时也殷切的盼望有同样兴趣的朋友能多给我(zhou.tom@163.com)些指导!——如若转贴请带上这最后一句:) |