CsGL is OpenGL for the .Net Framework, providing support for OpenGL 1.1 - 1.4 and numerous extensions.
CsGL是.Net Framework平台下的OpenGL,对OpenGL 1.1 - 1.4提供支持和扩展。
发布站点:
下载地址:
http://sourceforge.net/projects/csgl/files/
本文所述环境是在CsGL 的1.4.1版本基础上写的:
主要文件列表如下:
GLViewer.1.1.src.tgz | Platform-Independent | 202.9 KiB | Sun Nov 03 2002 00:00 | Source .zip | 9213 | |
GLViewer.1.1.bin.tgz | i386 | 439.2 KiB | Sun Nov 03 2002 00:00 | Source .zip | 13420 | |
CsGLExamples.0.9.1.zip | i386 | 4.7 MiB | Sun Nov 03 2002 00:00 | .zip | 45582 | |
csgl.1.4.1.doc.zip | Platform-Independent | 1.1 MiB | Sun Nov 03 2002 00:00 | .zip | 51782 | |
csgl.1.4.1.src.zip | Platform-Independent | 504.2 KiB | Sun Nov 03 2002 00:00 | Source .zip | 44544 | |
csgl.1.4.1.dll.zip | i386 | 352.6 KiB | Sun Nov 03 2002 00:00 | .zip | 98386 |
其中我用过以下两个文件:
csgl.1.4.1.dll.zip为动态链接库文件,将其下载引用即可进行OpenGL 3D编程
CsGLExamples.0.9.1.zip为一些示例的源代码和可执行文件,其中包括Nehe的CsGL源代码,不过实在GUN平台下建立的,Visual Studio 2008 无法直接应用,起初也是这个原因我转向SharpGL的。前段时间详细看了一下说明,知道了具体的用法。
Note:本说明的方法是在本人业余时间摸索下完成的,网上关于CsGL的例子和使用方法很少,没什么可参考的资料,虽然没什么技术含量,但是还是可以帮助相关的人少走弯路(也可能是误入歧途),所以代码的完整性和安全性都不能够保证,以下内容发现错误我会重新编辑,故禁止转载,以防误导他人。代码中的一切错误本人概不负责,如有任何意见、建议技术交流以及文中错误请联系我或者直接在这里留言。wanglei_wan@yahoo.com.cn
1. 在CsGLExamples.0.9.1.zip的解压文件中的CsGLExamples.0.9.1/CsGLExamples/src/NeHeLessons/src路径下面是CsGL的基本代码类,下面的代码就是CsGLExamples.0.9.1.zip中Nehe第一课的源代码。
其代码继承于CsGL中的Model类,这个类提供了CsGL运行的一个基本代码模板。具体代码效果在文件中可以找到。要是想在Visual Studio中改编的话需要在工程中引用CsGL.Basecode.dll。
先声明引用
using CsGL.Basecode;
然后像例子一样在代码中重写Draw()等函数就可以了。这种代码方式有个弊端就是可控性不高,优点是可以最快的建立OpenGL的应用程序。下图是这种方法产生的应用程序的询问对话框。
下图是执行效果:
我没有用这种方法产生的对话框,因为要改动窗体就要读其开发文档,以后再读吧!可以当成参考代码。
2.采用继承CsGL中的OpenGLControl类的方法
<1> 新建Form工程,添加一个新建的空类(本例为OpenGLBase)用于继承CsGL中的OpenGLControl类,继承后的OpenGLBase类就可以当OpenGL控件使用了。(这中做法的目的是因为C#中不允许多重继承,Form工程的主窗口继承了Form类就不能够再继承OpenGLBase类了)。添加CsGL的引用
<2> 修改空类,将新类继承与OpenGLControl 如下面代码
class OpenGLBase : OpenGLControl
{
}
<3> 在OpenGLBase类中创建Timer用于定时刷新OpenGL窗口。(此Timer用的是Form类的)
Timer Timer_GLupdate = new Timer();//窗口重绘计时器
<4> 修改OpenGLBase类的构造函数,构造函数主要初始化计时器的Tick事件的回调函数,如果需要对按键作出响应,则需要设置KeyDown事件的回调。具体构造函数基本代码的模板如下。
public OpenGLBase()
{
this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
this.Timer_GLupdate.Interval = 10;
this.Timer_GLupdate.Start();
this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown);
}
<5> 创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口
private void Timer_GLupdate_Tick(object sender, EventArgs e)
{
this.Invalidate();
}
<6> 创建按键响应计时器回调函数,(按照个人需求添加),响应按键信息,可以按需要修改
private void OpenGLBase_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.D:
break;
case Keys.A:
break;
case Keys.S:
break;
case Keys.W:
break;
default:
break;
}
}
<7> 重写OpenGLControl类的以下几个函数:
OnSizeChanged();//窗口大小改变时发生(窗体加载的时候会运行一次)
InitGLContext();//OpenGL初始化场景
glDraw(); //OpenGL绘制函数,绘图代码都在这里完成
<8> 在主Form类中添加对象
OpenGLBase myGLView = new OpenGLBase();
<9> 在Form类的构造函数中添加以下代码,主要将myGLView作为控件显示于Form窗口
myGLView.Dock = DockStyle.Fill;
myGLView.Location = new Point(0, 0);
myGLView.Name = "OpenGLView1";
myGLView.Visible = true;
Controls.Add(myGLView);
ResumeLayout(false);
<10> 代码的模板下载,可以直接运行
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
GL.glLoadIdentity();
GL.glBegin(GL.GL_TRIANGLES);
GL.glVertex3f(0.0f, 1.0f, 0.0f);
GL.glVertex3f(-1.0f, -1.0f, 0.0f);
GL.glVertex3f(1.0f, -1.0f, 0.0f);
GL.glEnd();
}
3 CsGLModelv1.0_Nehe_Walx_exp4_Triangles And Quads Color Rotate
4 CsGLModelv1.0_Nehe_Walx_exp5_3D Cubic Rotate
5_1 CsGLModelv1.0_Nehe_Walx_exp6_1_3D Cubic Rotate_texture map
5_2 CsGLModelv1.0_Nehe_Walx_exp6_2_3D Cubic Rotate_texture map
6 CsGLModelv1.0_Nehe_Walx_exp7_3D Cubic Rotate_texture map Light and Key
只有W,S键可用于拉近和拉远距离
7 CsGLModelv1.0_Nehe_Walx_exp8_3D Cubic Rotate_texture map Light and Key and Admixture注:
键盘映射
WSAD,QE----立方体的上下左右,前后
IKJL,UO----光源的上下左右,前后
B-Admixture开关(混合)
Space-Light开光(光源)
运行代码后开启Admixture,调整光源位置可得下图
关闭Admixture可得下图
关闭光源
移动光源(Admixture此时是开着的)
移动立方体
8 CsGLModelv1.0_Nehe_WL_exp9_3D Star
9 CsGLModelv1.0_Nehe_WL_exp10_Loading And Moving Through A 3D World
WSAD---第一视角前后移动左右转动
注:我的压缩文件夹命名太长了,运行时会出错,所以下载后把压缩文件的文件名删去一部分在解压!
(像不像打CS啊,嘻嘻)
10 CsGLModelv1.0_Nehe_Walx_exp11_Flag Effect(Waving Texture)