你的位置:首页 > ASP.net教程

[ASP.net教程]SharpGL学习笔记(一) 平台构建与Opengl的hello World


 

(一)平台构建与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

 

 至于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就好了。

 

源代码如下:已经做了详细解释

 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方向任意旋转哦。

 

 

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

 

本节源代码下载