(一)平台构建与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的总结如下:

    (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/

SharpGL学习笔记(一) 平台构建与Opengl的hello World (转)的更多相关文章

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

    (一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...

  2. SharpGL学习笔记(七) OpenGL的变换总结

    笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...

  3. SharpGL学习笔记(十一) 光源创建的综合例子:光源参数可调节的测试场景

    灯光的测试例子:光源参数可以调节的测试场景 先看一下测试场景和效果. 场景中可以切换视图, 以方便观察三维体和灯光的位置.环境光,漫射光,镜面反射光都可以在四种颜色间切换. 灯光位置和摄像机位置(Lo ...

  4. ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理

    ArcGIS案例学习笔记2_2_模型构建器和山顶点提取批处理 计划时间:第二天下午 背景:数据量大,工程大 目的:自动化,批处理,定制业务流程,不写程序 教程:Pdf/343 数据:chap8/ex5 ...

  5. SharpGL学习笔记(九) OpenGL的光照模型, 术语解释

    在3D场景中,每个像素最终显示出来的颜色都是经过大量计算而得到的,其中一些计算是依赖于场景中的光照以及场景中物体对光线的反射和吸收情况. 例如,对于一个红色的物体, 在白色光(白光是红光,绿光和蓝光等 ...

  6. SharpGL学习笔记(十三) 光源例子:环绕二次曲面球体的光源

    这是根据徐明亮<OpenGL游戏编程>书上光灯一节的一个例子改编的. 从这个例子可以学习到二次曲面的参数设置,程序中提供了两个画球的函数,一个是用三角形画出来的,一个是二次曲面构成的. 你 ...

  7. docker学习笔记:简单构建Dockerfile【Docker for Windows】

    参考与入门推荐:https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html#autoid-0-0-9 最近学习docker,写一个简单构建Doc ...

  8. SharpGL学习笔记(十九) 摄像机漫游

    所谓的摄像机漫游,就是可以在场景中来回走动. 现实中,我们通过眼睛观察东西,身体移动带动眼睛移动观察身边的事物,这也是在漫游. 在OpenGL中我们使用函数LookAt()来操作摄像机在三维场景中进行 ...

  9. SharpGL学习笔记(十八) 解析3ds模型并显示

    笔者设想的3D仿真中的元件,是不可能都是“画”出来的.这样就玩复杂了,应该把任务分包出去,让善于制作模型的软件来制作三维模型,我们只需要解析并且显示它即可. 3dsmax制作三维模型的方便,快捷,专业 ...

随机推荐

  1. Dubbbo

    什么是Dubbo Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有 ...

  2. Hive-2.3.6 安装

    本安装依赖Haddop2.8安装 https://www.cnblogs.com/xibuhaohao/p/11772031.html 一.下载Hive与MySQL jdbc 连接驱动 apache- ...

  3. Kubernetes 学习26 基于kubernetes的Paas概述

    一.概述 1.通过以往的学习应该可以了解到k8s 和以往提到的devops概念更容易落地了.比如我们说的CI,CD,CD a.CI(Continuous Integration):持续集成 b.CD( ...

  4. PHP命令行执行文件或代码

    Linux环境 1.执行代码 php -r "echo 'hello';" (注意加分号,与PHP文件一样) 2.执行文件 php -f  文件所在路径(/var/www/xxx. ...

  5. 【转载】Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info

    网上查到http://social.msdn.microsoft.com/Forums/vstudio/en-US/58271e39-beca-49ac-90f9-e116fa3dd3c0/mxed- ...

  6. phpize是干嘛的

    安装php(fastcgi模式)的时候,常常有这样一句命令:/usr/local/webserver/php/bin/phpize一.phpize是干嘛的?phpize是什么东西呢?php官方的说明: ...

  7. 36、将RDD转换为DataFrame

    一.概述 为什么要将RDD转换为DataFrame? 因为这样的话,我们就可以直接针对HDFS等任何可以构建为RDD的数据,使用Spark SQL进行SQL查询了.这个功能是无比强大的. 想象一下,针 ...

  8. 洛谷P5098 洞穴里的牛之三

    题目 贪心,可以用分类讨论的方法,可以得出如果\(n^2\)枚举则会过不了,而我们观察原题中的式子,有: \(∣x1−x2∣+∣y1−y2∣\) 发现式子中的绝对值很恶心,而考虑如果没有绝对值的话会有 ...

  9. linux 查看带宽瓶颈

    1.首先要确定网卡带宽是多少(单位是Mbit/s) ethtool eth1 | grep Speed 2.确定当前带宽使用情况 使用 nload 工具,如果没有可以yum install nload ...

  10. mybatis-sqlite日期类型对应关系

    1.问题 sqlite数据库 user表,create_time字段,类型DATETIME,设置默认值datetime('now') mybatis,User实体,createTime类型为java. ...