一个是官方的版本,即csgl,当前版本是:1.4.1.0,包括两个dll,csgl.dll和csgl.native.dll,其中csgl.dll是.NET的程序集,提供OpenGL类和实用包;csgl.native.dl不是.NET的程序集,而是普通的dll,为CsGL做一些本地和私有工作,比如CsGL.OSLib类型初始值的设定。因此,可以看到这两个dll都很重要,必须将其拷贝到当前程序的执行目录下,其实最简单的方法就是将这两个dll直接拷贝到系统目录下,即:C:/WINDOWS/system32目录下,这样一劳永逸,不用在每个程序的执行目录下存放副本。
另外,在NeHe的教程里看到CsGL.Basecode.dll,经过研究,这个是为了快速开发,为这个版本的csgl的应用程序的开发提供的一个模板,并写成了.NET程序集,名称为CsGL.Basecode.dll,当前版本为1.0.0.0,在开发应用程序的时候使用CsGL.Basecode.dll,开发者只要关注自己的场景绘制,输入输出控制等工作,不用关心渲染窗体创建,消息传递等工作,而且关于渲染的流程都封装好了,开发者只需要继承Model类并重写几个方法,相当简单,其实这个可以称作为框架,在Direct3D中,也有DXUT,这个就是微软给用户提供的一个框架,快速开发,用户所要做的就是提供一些回调函数,并把这些回调函数注册到框架中。不管是CsGL.Basecode.dll,还是DXUT,都极大地方便了开发者开发,让开发者专注于核心工作。
第二个版本是Mono项目中,Randy开发的Tao.OpenGl,当前版本是2.1.0.4,它提供了三个dll,Tao.OpenGl.dll,Tao.Platform.Windows.dll,和Tao.FreeGlut.dll。开发应用程序的时候,只需要添加这三引用就可以,也是相当的方便。既然在.Net版本中,共有三种选择策略:单纯的csgl,使用CsGL.Basecode.dll的csgl以及Tao.OpenGl,那么选择那种比较好哪?其实本身上这三种都是对OpenGL的封装,只是封装程度有高有低,所以根据自己的熟悉程度来选择,即可。不过要说明的是:后两种方法易于快速开发。
1:使用单纯的csgl开发流程:
声明一个自定义的Control,用作渲染面板。
public class OurView: OpenGLControl
{
protected override void InitGLContext() 使能渲染状态,设置渲染参数。
protected override void OnSizeChanged(EventArgs e) 调整窗口,重新设置投影,模型视窗。
public override void glDraw( ) 场景绘制、渲染。也可以自定义,而不重载。
}
定义主窗体和程序入口点Main函数
public class MainForm : System.Windows.Forms.Form
{
private OurView view;声明一个我们定义的OurView渲染面板的对象。
public MainForm()
{
this.view = new lesson05.OurView();
this.view.Parent = this;
this.view.Dock = DockStyle.Fill;
this.Show(); 不要忘记将创建的form显示出来。
}
static void Main()
{
MainForm form = new MainForm();
while (!form.IsDisposed)
{
form.view.glDraw();
form.Refresh();
Application.DoEvents();
}
form.Dispose();
}
}
2:基于CsGL.Basecode.dll的csgl应用程序开发流程
声明一个自定义的Model,这里是称作MiscPongMania,用控制渲染。
public sealed class MiscPongMania : Model
{
public override void Initialize() 可选
public override void Draw() 必须重载。
public override void InputHelp() 可选
public override void ProcessInput() 可选
}
定义主窗体和程序入口点Main函数
public static void Main()
{
App.Run(new MiscPongMania()); 使用程序集CsGL.Basecode.dll中的类App 的静态方法Run来运行我们刚才定义的Model的实例。
}
3:Tao.OpenGl进行应用程序开发的流程
public partial class Form1 : Form
{
//定义一个用户渲染的窗口:simpleOpenGlControl1
private Tao.Platform.Windows.SimpleOpenGlControl simpleOpenGlControl1;
public Form1()
{
this.simpleOpenGlControl1.Dock = System.Windows.Forms.DockStyle.Fill;
}
private void simpleOpenGlControl1_Load(object sender, EventArgs e) A
private void simpleOpenGlControl1_SizeChanged(object sender, EventArgs e) B
public override void Draw() 也可以自定义,而不重载;
private void Form1_Load(object sender, EventArgs e)
{
simpleOpenGlControl1.InitializeContexts();
simpleOpenGlControl1.SwapBuffers();
simpleOpenGlControl1.Load+=new EventHandler(A); A为上面函数的名字
simpleOpenGlControl1.SizeChanged +=new EventHandler(B); 同上
注册鼠标、键盘事件。
#region mouse and key handles
#endregion
}
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
从以上代码流程可以看出:第三种方式最简捷,最方便,开发者只需要专心关注自己的场景构建和输入输出处理。