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

转载于:https://www.cnblogs.com/xihong2014/p/11011016.html

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

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

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

  2. CSDN-我的在线学习笔记分享平台

    CSDN-我的在线学习笔记分享平台 1.你来自哪里?来CSDN想收获什么? 4.你用过哪些开源项目让你忍不住推荐给朋友? 5.有什么事情想做很久了?还没去做的原因是什么? 6.你和朋友讨论过的哪些有趣 ...

  3. Docker技术入门与实战 第二版-学习笔记-2-镜像构建

    3.利用 commit 理解镜像构成 在之前的例子中,我们所使用的都是来自于 Docker Hub 的镜像. 直接使用这些镜像是可以满足一定的需求,而当这些镜像无法直接满足需求时,我们就需要定制这些镜 ...

  4. Docker学习笔记之四,构建一个Redis as a Service(RAAS)

    Docker的抽象 若把一台Linxu机器比喻为一艘船,那么每一个Linux Container就好比船上的一个集装箱. 另外一个层面,Docker Image(镜像)就是一个预先定义行为的模板,Do ...

  5. 【TensorFlow-windows】学习笔记四——模型构建、保存与使用

    前言 上一章研究了一些基本的构建神经网络所需的结构:层.激活函数.损失函数.优化器之类的,这一篇就解决上一章遗留的问题:使用CNN构建手写数字识别网络.保存模型参数.单张图片的识别 国际惯例,参考博客 ...

  6. LabWindows_CVI测试技术及工程应用_学习笔记1(构建一个简单的程序)

    构建一个简单的程序 1.创建工程文件 或File--〉New--〉Project(*.prj),默认名Untitled.prj,存储在Unititled.cws的工作空间中 File--〉Save U ...

  7. 软件工程作业-方舟学习笔记07-方舟构建方法

    这一篇比较一下SSA构建方法与传统编译器的区别和优化,先来看一组比较实例: 一般方法 SSA方法 a=b+c: a1=b1+c1: a=a+b: a2=a1+b1: b=a+c: b2=a2+c1: ...

  8. SpringCloud学习笔记019---Windows 平台安装 MongoDB

    MongoDB 下载 MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mon ...

  9. Android学习笔记---Android平台1.使用dom解析xml文件

    1.使用dom解析xml文件 除了使用 SAX可以解析XML文件,大家也可以使用熟悉的DOM来解析XML文件. DOM解析XML文 件时,会将XML文件的所有内容以文档树方式存放在内存中,然后允许您使 ...

最新文章

  1. ds oracle connector 连接组件,Datastage 8.5 连接远程Oracle 数据库
  2. Python中单线程、多线程与多进程的效率对比实验
  3. GridView的全选与反选
  4. 错误记录(part1)--Error loading server extension jupyter_nbextensions_configurator
  5. SCVMM2012 SP1 之P2V转换
  6. java判断两个矩形是否相交_判断矩形相交以及求出相交的区域
  7. 【计算机组成原理】存储系统综合实验
  8. EDA技术与市场分析
  9. 商品信息SKU数据库设计
  10. wpsarm64linux,64位Ubuntu 14.04 安装wps
  11. cad隐藏图层命令快捷键_CAD中,有没有快速隐藏其他图层的快捷键啊? 新上
  12. 记录一次使用ParallelGC导致线上FGC频繁、耗时长的原因
  13. /proc/config.gz 是什么
  14. 高通msm8996启动流程
  15. 如何评价腾讯发布的区块链游戏《一起来捉妖》?
  16. mes项目 组态开发项目reademe文档 待整理
  17. oracle学习app,Oracle学习相关
  18. 修改gh-ost源码实现两表在线高速复制
  19. java 1f8b0800,常用ASCII/ISO-8859-1/GB2312/GBK/UTF-8等字符编码梳理
  20. 各种笔记本、台式和主板品牌,进入BIOS设置的方法大全

热门文章

  1. Open vSwitch流表应用实战
  2. 基于python的web应用(二)
  3. Linux 开发环境工具 下载网址大全
  4. Flask成长笔记--在Flask中加密的方式
  5. SQLite指南(4) - FAQ列表(important)
  6. c语言数据页,c语言基础--数据类型(51页)-原创力文档
  7. [Python] L1-042 日期格式化-PAT团体程序设计天梯赛GPLT
  8. 第七届 蓝桥杯 省赛 第八题 四平方和
  9. 蓝桥杯ADV-172 算法提高 身份证排序
  10. 蓝桥杯 ADV-62算法提高 夺宝奇兵(动态规划)