SharpGL学习笔记(一) 平台构建与Opengl的hello World (转)

(一)平台构建与Opengl的hello Worldwindows

 

OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最多见的DirectorX组件中的3d功能。 因此不要期望windows提供对Opengl提供最新的什么支持。缓存

C#的开发环境也没有封装Opengl的组件,Opengl的官方的dll是供C,C++开发用的。要想用在C#中你得本身导入DLL函数。但我相信你不会这样作的,仍是引入第三方的Opengl库来得方便。框架

 

SharpGL就是C#用的OpenGL库,之因此选择它,是由于它最后更新的时间较近,网上的C++教程也最多,并且这个库是有成功的商业开发应用的,能够放心使用。函数

源码下载地址:this

http://www.oschina.net/p/sharpglspa

 

引用网上对SharpGL的评价,笔者说几句:.net

对于第1点,能支持wpf程序,笔者很赞。3d

对于第2点,显然是以讹传讹,笔者为此跑了一个sharpgl程序几个小时,也没看到有什么内存增加。因此应该是当前版本把之前的内存泄露问题给解决了。至因而最先哪一个版本给解决的,我就不得而知了。code

对于第4点,显然对笔者无所谓。orm

许多人去选择OpenTK,若是他不是去开发OpenGL ES的话,那么多半是惧怕内存泄露而不选择SharpGL。

显然说来讲去仍是需求来肯定你该选择什么,若是开发OpenGL ES,你只能选择OpengTK,不然若是只是作windows平台的开发,SharpGL和OpengTK均可以选择。

复制代码
 对SharpGL的总结以下:

    (1)安装部署方便,能够很是容易的集成到Windows Forms和WPF中去使用; (2)存在内存泄露的问题,即便运行一个简单的程序,内存在不断增加,当增加到了必定时就不会有太多的增加,因为例程都有这样的问题,对于咱们本身编写程序,应做适当考虑; (3)目前SharpGL已经支持到OpenGL4.2(http://sharpgl.codeplex.com/discussions/431042),在全部的第三方库中,其支持的OpenGL版本应该是最高的; 4)不支持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控件,那么你保存下这个工程,从新打开应该就行了。

至于为何会这样,笔者也不清楚。

 

源代码以下:已经作了详细解释

复制代码
 1 using System;  2 using System.Windows.Forms;  3 using SharpGL;  4  5 namespace blankTest  6 {  7 public partial class Form1 : Form  8  {  9 10 public Form1() 11  { 12  InitializeComponent(); 13 14  } 15 16 private void Form1_Load(object sender, EventArgs e) 17  { 18 19  } 20 21 private void openGLControl1_OpenGLInitialized(object sender, EventArgs e) 22  { 23 OpenGL gl = openGLControl1.OpenGL; 24 gl.ClearColor(0, 0, 0, 0); 25  } 26 27 private void openGLControl1_Resize(object sender, EventArgs e) 28  { 29 OpenGL gl = openGLControl1.OpenGL; 30 31 // 设置当前矩阵模式,对投影矩阵应用随后的矩阵操做 32  gl.MatrixMode(OpenGL.GL_PROJECTION); 33 34 // 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心 35  gl.LoadIdentity(); 36 37 // 建立透视投影变换 38 gl.Perspective(30.0f, (double)Width / (double)Height, 5, 100.0); 39 40 // 视点变换 41 gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0); 42 43 // 设置当前矩阵为模型视图矩阵 44  gl.MatrixMode(OpenGL.GL_MODELVIEW); 45  } 46 47 private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e) 48  { 49 SharpGL.OpenGL gl = this.openGLControl1.OpenGL; 50 //清除深度缓存 51 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); 52 53 //重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心 54  gl.LoadIdentity(); 55 56 //坐标轴变换位置到(-1.5,0,-6) 57 gl.Translate(-1.5f, 0f, -6f); 58 59  gl.Begin(OpenGL.GL_TRIANGLES); 60  { 61 //顶点 62 gl.Vertex(0.0f, 1.0f, 0.0f); 63 //左端点 64 gl.Vertex(-1.0f, -1.0f, 0.0f); 65 //右端点 66 gl.Vertex(1.0f, -1.0f, 0.0f); 67  } 68  gl.End(); 69 70 //把当前坐标系右移3个单位,注意此时是相对上面(-1.5,0,-6)点定位 71  gl.Translate(3f, 0f, 0f); 72 73  gl.Begin(OpenGL.GL_QUADS); 74  { 75 gl.Vertex(-1.0f, 1.0f, 0.0f); 76 gl.Vertex(1.0f, 1.0f, 0.0f); 77 gl.Vertex(1.0f, -1.0f, 0.0f); 78 gl.Vertex(-1.0f, -1.0f, 0.0f); 79  } 80  gl.End(); 81 gl.Flush(); //强制刷新 82 83  } 84  } 85 }
复制代码

 

openGLControl1_OpenGLInitialized,
openGLControl1_Resiz,
openGLControl1_OpenGLDraw
这三个都是控件 openGLControl1 的自带标准事件。
效果就像下图这样了。

 

 整这许多代码,却看到画出这个东西,是否是有些小失望? 不知道和GDI+有什么不一样,对吧?

其实,不一样的是,GDI+是纯2D的, 而上面这两个基础图形可不是2D,而是在3D空间的,虽然它只是一个片,可是也能够在x,y,z方向任意旋转哦。

 

 

 本例虽然简单,仍是附上源代码吧! 省得搞不出来影响心情。 ^_^

 

本节源代码下载

 

原创文章,出自"博客园, 猪悟能'S博客" : http://www.cnblogs.com/hackpig/

相关文章
相关标签/搜索