C# CSGL
转、修改自ShareIdeas文章C# 基于CSGL opengl
OpenGL是一个功能强大的开放图形库(Open Graphics Library)。其前身是SGI公司为其图形工作站开发的IRIS GL。为使其能够更加容易地移植到不同的硬件和操作系统,SGI开发了OpenGL。从程序开发人员的角度来看,OpenGL是一组绘图命令的API集合。利用这些API能够方便地描述二维和三维几何物体,并控制这些物体按某种方式绘制到显示缓冲区中。OpenGL的API集提供了物体描述、平移、旋转、缩放、光照、纹理、材质、像素、位图、文字、交互以及提高显示性能等方面的功能,基本涵盖了开发二、三维图形程序所需的各个方面。
我这里用到的是CsGl框架,CsGL是openGL在.NET下的包装。可以在网上下载:目前关于CsGL的开发基本上已经停止,官方主页上的
说法是认为CsGL对大多数应用而言已经足够稳定了,目前CsGL开发工作基本上集中在Example程序的撰写.主要文件列表如下:
DEMO
代码说明:这里主要是编写OpenGLBase 这个类的代码:
/// <summary>
/// 新建一个类,因为C#不允许多重继承
/// </summary>
class OpenGLBase : OpenGLControl
{
} // OpenGLBase类中主要包括下面一些方法:
// 1.创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口
private void Timer_GLupdate_Tick(object sender, EventArgs e){
this.Invalidate();
}
//.创建按键响应计时器回调函数,(按照个人需求添加),响应按键信息,可以按需要修改.
private void OpenGLBase_KeyDown(object sender, KeyEventArgs e){}
//.窗口大小改变时发生(窗体加载的时候会运行一次)
protected override void OnSizeChanged(EventArgs e) {} //. OpenGL初始化场景
protected override void InitGLContext()
{}
//. OpenGL绘制函数,绘图代码都在这里完成
public override void glDraw()
{
}
下面是完整OpenGLBase类的原码,代码来自NEHE教程。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CsGL.OpenGL;
using System.Windows.Forms; namespace CsGl_Tri_squ
{
/// <summary>
/// 新建一个类,因为C#不允许多重继承
/// </summary>
class OpenGLBase : OpenGLControl
{
//Timer Timer_GLupdate = new Timer();窗口重绘计时器
Timer Timer_GLupdate = new Timer();// 窗口重绘计时器
private static float rtri = ; // Angle For The Triangle
private static float rquad = ; // Angle For The Quad public OpenGLBase()
{
this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
this.Timer_GLupdate.Interval = ;
this.Timer_GLupdate.Start();
this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown); //委托
}
//定时器触发的方法
private void Timer_GLupdate_Tick(object sender, EventArgs e)
{
this.Invalidate();
}
private void OpenGLBase_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.D:
break;
case Keys.A:
break;
case Keys.S:
break;
case Keys.W:
break;
default:
break;
}
}
/// <summary>
/// 重写窗体大小 改变方法
/// </summary>
/// <param name="e"></param>
protected override void OnSizeChanged(EventArgs e)
{ GL.glViewport(, , this.Bounds.Width, this.Bounds.Height); GL.glMatrixMode(GL.GL_PROJECTION);
GL.glLoadIdentity();
GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f); GL.glMatrixMode(GL.GL_MODELVIEW);
}
/// <summary>
/// OnPaint方法处理Paint事件
/// </summary>
/// <param name="pevent"></param>
protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)
{
base.OnPaint(pevent);
//ToDo:可加入自己的设计代码
}
/// <summary>
/// OpenGL初始化场景
/// </summary>
protected override void InitGLContext()
{
base.InitGLContext();
GL.glEnable(GL.GL_DEPTH_TEST); // Enables Depth Testing
// GL.glDepthFunc(GL.GL_LEQUAL); // The Type Of Depth Testing To Do
// GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // Really Nice Perspective Calculations
GL.glMatrixMode(GL.GL_PROJECTION);
GL.glLoadIdentity();/
GL.gluPerspective(50.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0);
GL.glMatrixMode(GL.GL_MODELVIEW);
GL.glLoadIdentity();
GL.glShadeModel(GL.GL_SMOOTH);
} public override void glDraw()
{ // Here's Where We Do All The Drawing
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
GL.glLoadIdentity(); // Reset The Current Modelview Matrix,单位化 GL.glTranslatef(-1.5f, 0.0f, -6.0f); // Move Left 1.5 Units And Into The Screen GL.glRotatef(rtri, 0.0f, 1.0f, 0.0f); // 绕Y轴旋转金字塔 rtri是角度
GL.glBegin(GL.GL_TRIANGLES); // Drawing Using Triangles
//正对的面
GL.glColor3f(1.0f, 0.0f, 0.0f); // Red
GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Front)
GL.glColor3f(0.0f, 1.0f, 0.0f); // Green
GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Left Of Triangle (Front)
GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue
GL.glVertex3f(1.0f, -1.0f, 1.0f); // Right Of Triangle (Front)
//
GL.glColor3f(1.0f, 0.0f, 0.0f); // Red
GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Right)
GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue
GL.glVertex3f(1.0f, -1.0f, 1.0f); // Left Of Triangle (Right)
GL.glColor3f(0.0f, 1.0f, 0.0f); // Green
GL.glVertex3f(1.0f, -1.0f, -1.0f); // Right Of Triangle (Right)
//
GL.glColor3f(1.0f, 0.0f, 0.0f); // Red
GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Back)
GL.glColor3f(0.0f, 1.0f, 0.0f); // Green
GL.glVertex3f(1.0f, -1.0f, -1.0f); // Left Of Triangle (Back)
GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue
GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Right Of Triangle (Back)
//
GL.glColor3f(1.0f, 0.0f, 0.0f); // Red
GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Left)
GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue
GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Left Of Triangle (Left)
GL.glColor3f(0.0f, 1.0f, 0.0f); // Green
GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Right Of Triangle (Left)
GL.glEnd(); // Finished Drawing The Pyramid GL.glLoadIdentity(); // Reset The Current Modelview Matrix,回到中心位置
GL.glTranslatef(1.5f, 0.0f, -7.0f); // Move Right 1.5 Units And Into The Screen 7.0 GL.glRotatef(rquad, 1.0f, 1.0f, 1.0f); // Rotate The Quad On The X, Y, And Z Axes
GL.glBegin(GL.GL_QUADS); // Draw A Quad
//
GL.glColor3f(0.0f, 1.0f, 0.0f); // Set The Color To Green
GL.glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Top)
GL.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top)
GL.glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top)
GL.glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top)
//
GL.glColor3f(1.0f, 0.5f, 0.0f); // Set The Color To Orange
GL.glVertex3f(1.0f, -1.0f, 1.0f); // Top Right Of The Quad (Bottom)
GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Top Left Of The Quad (Bottom)
GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Bottom)
GL.glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Bottom)
//
GL.glColor3f(1.0f, 0.0f, 0.0f); // Set The Color To Red
GL.glVertex3f(1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front)
GL.glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front)
GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Front)
GL.glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Front)
//
GL.glColor3f(1.0f, 1.0f, 0.0f); // Set The Color To Yellow
GL.glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Back)
GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Back)
GL.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Back)
GL.glVertex3f(1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Back)
//
GL.glColor3f(0.0f, 0.0f, 1.0f); // Set The Color To Blue
GL.glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left)
GL.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Left)
GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Left)
GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Left)
//
GL.glColor3f(1.0f, 0.0f, 1.0f); // Set The Color To Violet
GL.glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Right)
GL.glVertex3f(1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right)
GL.glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Right)
GL.glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Right)
GL.glEnd(); // Done Drawing The Cube
rtri += 0.6f; // Increase The Rotation Variable For The Triangle
rquad += 0.6f; // Decrease The Rotation Variable For The Quad,单位是角度 } }
}
C# CSGL的更多相关文章
- OpenTK学习笔记:C#的中开发OpenGL程序的4种开源封包库SharpGL、CsGL、OpenTK、Tao框架的简单对比
最近要在C#的语言环境下开发OpenGL程序,参考了网上的博客论坛http://www.cnblogs.com/hanyonglu/archive/2012/06/12/2546581.html,总结 ...
- CSGL
glShadeModel void glShadeModel(GLenum mode) GL_FLAT/[GL_SMOOTH] 着色技术选择 glClearDepth GL.glClearDepth( ...
- CsGL着色的三角形
转自NeHe教程 public override void Draw() { // Here's Where We Do All The Drawing glClear(GL_COLOR_BUFFER ...
- C# 开源框架
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...
- C#开源系统大汇总(个人收藏)
C#开源系统大汇总 一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖 ...
- C#常用开源类库
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...
- .NET平台下开源框架
一.AOP框架Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(asp ...
- C#开源系统大汇总
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...
- C#开源资源项目
一.AOP框架 Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(as ...
随机推荐
- vs中如何统计整个项目的代码行数
在一个大工程中有很多的源文件和头文件,如何快速统计总行数? ------解决方案--------------------b*[^:b#/]+.*$^b*[^:b#/]+.*$ ctrl + shift ...
- java实战
1.http://learning.happymmall.com/ http://www.happymmall.com/index.html 前台官网 http://test.happymmall. ...
- H5页面调用手机打电话功能
<head>里面加上: <meta name="format-detection" content="telephone=yes"/> ...
- LeetCode(11):盛最多水的容器
Medium! 题目描述: 给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, ...
- js下判断 iframe 是否加载完成的完美方法
一般来说,我们判断 iframe 是否加载完成其实与 判断JavaScript 文件是否加载完成. 采用的方法很类似: var iframe = document.createElement( ...
- L3-004 肿瘤诊断 dfs bfs
在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积. 输入格式: 输入第一行给出4个正整数:M.N.L.T,其中M和N是每张切片的尺寸(即每张切片 ...
- 019 jquery中的动画
1.隐藏和显示 2.透明度与高度 3.可见性 4.程序一(show与hide加入参数实现动画) <!DOCTYPE html> <html> <head> < ...
- Eclipse下Maven新建项目、自动打依赖jar包(包含普通项目和Web项目)
不多说,直接上干货! 当我们无法从本地仓库找到需要的构件的时候,就会从远程仓库下载构件至本地仓库.一般地,对于每个人来说,书房只有一个,但外面的书店有很多,类似第,对于Maven来说,每个用户只有一个 ...
- 001.DNS原理及配置格式
一 dns简介 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串. ...
- Python - 计算个人所得税
最近在学python,写了个计算个人所得税计算的脚本,分享. 以下为python3适用版本 #!/usr/bin/python # -*- coding: UTF-8 -*- # 该python脚本用 ...