(一)平台构建与Opengl的hello World
OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能。 所以不要指望windows提供对Opengl提供最新的什么支持。
C#的开发环境也没有封装Opengl的组件,Opengl的官方的dll是供C,C++开发用的。要想用在C#中你得自己导入DLL函数。但我相信你不会这样做的,还是引入第三方的Opengl库来得方便。
SharpGL就是C#用的OpenGL库,之所以选择它,是因为它最后更新的时间较近,网上的C++教程也最多,而且这个库是有成功的商业开发应用的,可以放心使用。
源码下载地址:
http://www.oschina.net/p/sharpgl
引用网上对SharpGL的评价,笔者说几句:
对于第1点,能支持wpf程序,笔者很赞。
对于第2点,显然是以讹传讹,笔者为此跑了一个sharpgl程序几个小时,也没看到有什么内存增长。所以应该是当前版本把以前的内存泄露问题给解决了。至于是最早哪个版本给解决的,我就不得而知了。
对于第4点,显然对笔者无所谓。
许多人去选择OpenTK,如果他不是去开发OpenGL ES的话,那么多半是害怕内存泄露而不选择SharpGL。
显然说来说去还是需求来确定你该选择什么,如果开发OpenGL ES,你只能选择OpengTK,否则如果只是做windows平台的开发,SharpGL和OpengTK都可以选择。
对SharpGL的总结如下: ()安装部署方便,可以非常容易的集成到Windows Forms和WPF中去使用; ()存在内存泄露的问题,即使运行一个简单的程序,内存在不断增长,当增长到了一定时就不会有太多的增长,由于例程都有这样的问题,对于我们自己编写程序,应作适当考虑; ()目前SharpGL已经支持到OpenGL4.(http://sharpgl.codeplex.com/discussions/431042),在所有的第三方库中,其支持的OpenGL版本应该是最高的; ()不支持Linux和Mac平台(http://sharpgl.codeplex.com/discussions/356490)
至于OpenGL能干嘛? 对于博主来说,学它是出于需要,想做3D仿真, 也许你很年青,有大把业余时间,那就可以用它来写个CS来爽爽。但博主还是认为学东西要以经济效益和工作需要两种力量为驱动力,否则就不要学,在这个知识爆表的年代,其实很有必须提倡节约时间,尽量把时间用在刀刃上的。
我们用vs2010的C#,构建一个空白的windows窗体应用程序
首先,把 下载的SharpGL里面的3个dll(除serialization.dll)引入C#,然后“选择项” 选择SharpGL.Winforms.dll , 就可以在面板上看到4个控件。其中OpenGLControl就可以把它播放到Form上去。它相当于Opengl的画板。
如果你把OpenGLControl拖放到Form上时不幸出现下面这样的画面。
那么多半是因为你用的vs2010,默认框架是.Net Framework 4 Client profile, 请切换为.Net Framework 4就好了。
如果不是这个原因,那么你运行程序看看有没有问题,如果能看到黑色的OpenGLControl控件,那么你保存下这个工程,重新打开应该就好了。
至于为什么会这样,笔者也不清楚。
源代码如下:已经做了详细解释
using System;
using System.Windows.Forms;
using SharpGL; namespace blankTest
{
public partial class Form1 : Form
{ public Form1()
{
InitializeComponent(); } private void Form1_Load(object sender, EventArgs e)
{ } private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
{
OpenGL gl = openGLControl1.OpenGL;
gl.ClearColor(, , , );
} private void openGLControl1_Resize(object sender, EventArgs e)
{
OpenGL gl = openGLControl1.OpenGL; // 设置当前矩阵模式,对投影矩阵应用随后的矩阵操作
gl.MatrixMode(OpenGL.GL_PROJECTION); // 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
gl.LoadIdentity(); // 创建透视投影变换
gl.Perspective(30.0f, (double)Width / (double)Height, , 100.0); // 视点变换
gl.LookAt(-, , -, , , , , , ); // 设置当前矩阵为模型视图矩阵
gl.MatrixMode(OpenGL.GL_MODELVIEW);
} private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e)
{
SharpGL.OpenGL gl = this.openGLControl1.OpenGL;
//清除深度缓存
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); //重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
gl.LoadIdentity(); //坐标轴变换位置到(-1.5,0,-6)
gl.Translate(-1.5f, 0f, -6f); gl.Begin(OpenGL.GL_TRIANGLES);
{
//顶点
gl.Vertex(0.0f, 1.0f, 0.0f);
//左端点
gl.Vertex(-1.0f, -1.0f, 0.0f);
//右端点
gl.Vertex(1.0f, -1.0f, 0.0f);
}
gl.End(); //把当前坐标系右移3个单位,注意此时是相对上面(-1.5,0,-6)点定位
gl.Translate(3f, 0f, 0f); gl.Begin(OpenGL.GL_QUADS);
{
gl.Vertex(-1.0f, 1.0f, 0.0f);
gl.Vertex(1.0f, 1.0f, 0.0f);
gl.Vertex(1.0f, -1.0f, 0.0f);
gl.Vertex(-1.0f, -1.0f, 0.0f);
}
gl.End();
gl.Flush(); //强制刷新 }
}
}
openGLControl1_OpenGLInitialized,
openGLControl1_Resiz,
openGLControl1_OpenGLDraw 这三个都是控件 openGLControl1 的自带标准事件。 效果就像下图这样了。
整这许多代码,却看到画出这个东西,是不是有些小失望? 不知道和GDI+有什么不同,对吧?
其实,不同的是,GDI+是纯2D的, 而上面这两个基础图形可不是2D,而是在3D空间的,虽然它只是一个片,但是也可以在x,y,z方向任意旋转哦。
本例虽然简单,还是附上源代码吧! 免得搞不出来影响心情。 ^_^
原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/