.Net平台下OpenGL绘制图形(1)(VS2019,Winform,C#)
1、介绍
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形到比较复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。
当今,OpenGL是视频行业领域中用于处理2D/3D图形的最为广泛接纳的API,在此基础上,为了用于计算机视觉技术的研究,从而催生了各种计算机平台上的应用功能以及设备上的许多应用程序。其是独立于视窗操作系统以及操作系统平台,可以进行多种不同领域的开发和内容创作,简而言之,其帮助研发人员能够实现PC、工作站、超级计算机以及各种工控机等硬件设备上实现高性能、对于视觉要求极高的高视觉图形处理软件的开发。
2、工具
在C#中直接调用OpenGL函数比较繁琐,一般不直接使用。我们可以借助第三方开源库,比如SharpGL、CsGL、OpenTK、Tao框架等。下面对这些框架逐一介绍,其中Tao已经停止维护和更新了,可以被OpenTK替代,这里就不介绍了。
3、winform窗体绘制立方体
VS2019,.NetFramework4.7
1,创建空解决方案项目OpenGLProjectApp
2、删除产生的项目,解决方案右键添加项目,选择windows窗体应用,项目名称为SharpGLFormsApp1
3、项目添加sharpgl引用
可以看到项目引用dll成功,同时工具箱多了一个类别
4,拖入不同控制,页面布局如图:
5、编写各个控件的事件,重点是那个openglcontrol的GDIDraw事件,完整代码:
using SharpGL;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace SharpGLFormsApp1
{public partial class Form1 : Form{/// <summary>/// 默认绘画模式为线条/// </summary>private uint _model = OpenGL.GL_LINE_LOOP;/// <summary>/// X轴坐标/// </summary>private float _x = 0;/// <summary>/// Y轴坐标/// </summary>private float _y = 0;/// <summary>/// Z轴坐标/// </summary>private float _z = 0;public Form1(){InitializeComponent();}/// <summary>/// 复位事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){_x = _y = _z = 0;tbX.Value = tbY.Value = tbZ.Value = Convert.ToInt32(_x);label1.Text = "X轴" ;label2.Text = "Y轴";label3.Text = "Z轴";}/// <summary>/// 线条选择事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void rbline_CheckedChanged(object sender, EventArgs e){_model = OpenGL.GL_LINE_LOOP;}/// <summary>/// 球面事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void rbfull_CheckedChanged(object sender, EventArgs e){_model = OpenGL.GL_QUADS;}/// <summary>/// 控件绘图事件/// </summary>/// <param name="sender"></param>/// <param name="args"></param>private void openGLControl1_GDIDraw(object sender, RenderEventArgs args){// 创建一个GL对象SharpGL.OpenGL gl = this.openGLControl1.OpenGL;gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // 清空屏幕gl.LoadIdentity(); // 重置gl.Translate(0.0f, 0.0f, -6.0f); // 设置坐标,距离屏幕距离为6gl.Rotate(_x, 1.0f, 0.0f, 0.0f); // 绕X轴旋转gl.Rotate(_y, 0.0f, 1.0f, 0.0f); // 绕Y轴旋转gl.Rotate(_z, 0.0f, 0.0f, 1.0f); // 绕Z轴旋转gl.Begin(_model); // 绘制立方体gl.Color(0.0f, 1.0f, 0.0f); // 设置颜色//绘制其中一个面gl.Vertex(1.0f, 1.0f, -1.0f);gl.Vertex(-1.0f, 1.0f, -1.0f);gl.Vertex(-1.0f, 1.0f, 1.0f);gl.Vertex(1.0f, 1.0f, 1.0f);//如下类同gl.Color(1.0f, 0.5f, 0.0f);gl.Vertex(1.0f, -1.0f, 1.0f);gl.Vertex(-1.0f, -1.0f, 1.0f);gl.Vertex(-1.0f, -1.0f, -1.0f);gl.Vertex(1.0f, -1.0f, -1.0f);gl.Color(1.0f, 0.0f, 0.0f);gl.Vertex(1.0f, 1.0f, 1.0f);gl.Vertex(-1.0f, 1.0f, 1.0f);gl.Vertex(-1.0f, -1.0f, 1.0f);gl.Vertex(1.0f, -1.0f, 1.0f);gl.Color(1.0f, 1.0f, 0.0f);gl.Vertex(1.0f, -1.0f, -1.0f);gl.Vertex(-1.0f, -1.0f, -1.0f);gl.Vertex(-1.0f, 1.0f, -1.0f);gl.Vertex(1.0f, 1.0f, -1.0f);gl.Color(0.0f, 0.0f, 1.0f);gl.Vertex(-1.0f, 1.0f, 1.0f);gl.Vertex(-1.0f, 1.0f, -1.0f);gl.Vertex(-1.0f, -1.0f, -1.0f);gl.Vertex(-1.0f, -1.0f, 1.0f);gl.Color(1.0f, 0.0f, 1.0f);gl.Vertex(1.0f, 1.0f, -1.0f);gl.Vertex(1.0f, 1.0f, 1.0f);gl.Vertex(1.0f, -1.0f, 1.0f);gl.Vertex(1.0f, -1.0f, -1.0f);gl.End(); // 结束绘制}/// <summary>/// X轴拖动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void tbX_Scroll(object sender, EventArgs e){int x = tbX.Value;_x = x;label1.Text = "X:" + x;}/// <summary>/// Y轴拖动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void tbY_Scroll(object sender, EventArgs e){int y = tbY.Value;_y = y;label2.Text = "Y:" + y;}/// <summary>///Z轴拖动事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void tbZ_Scroll(object sender, EventArgs e){int z = tbZ.Value;_z = z;label3.Text = "Z:" + z;}}
}
6、运行效果
相关文章:

.Net平台下OpenGL绘制图形(1)(VS2019,Winform,C#)
1、介绍 OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成…...
Casso的创作纪念日
机缘 注册CSDN的时候才刚上大学,到现在使用CSDN已经四年了,距发布第一篇文章却只刚过去一百多天,刚看到这个提醒消息的时候只感慨时间过得真快,自己也在慢慢成长着,当初刚开始学习的时候,查资料用得最多的就…...
Bernhard‘s Talk on Towards Causal NLP 笔记
因果学习系列笔记 这是我的 GitHub 因果学习笔记仓库 https://github.com/xin007-kong/ryCausalLearning,欢迎 star🤩 讲者是 Bernhard Schlkopf talk 链接:(41) Bernhard Schoelkopf | Towards Causal NLP | KeynoteEMNLP 2021 Causal Infer…...

ES6模块化规范
在没有ES6模块化规范前,有像AMD、CMD这样的浏览器模块化规范,还有像CommonJS这样的服务端模块化规范。 2015年,JS终于推出了官方的模块化规范,为了统一各种规范,我们简称ES6 模块化。 ES6目前作为JS的内置模块化系统&a…...

红黑树下岗,内核新数据结构上场:maple tree!
在外界看来,Linux 内核的内部似乎变化很少,尤其是像内存管理子系统(memory-management subsystem)这样的子系统。然而,开发人员时常需要更换内部接口来解决某些长期存在的问题。比如,其中一个问题就是用来保…...

Angular开发之——Angular打包部署项目(04)
一 概述 ng build 构建应用lite-server介绍及安装lite-server部署应用IIS管理器部署应用 二 ng build 构建应用 2.1 执行如下指令构建应用 ng build2.2 构建完成后,会创建一个 dist 文件夹 2.3 直接打开index.html会出错(需要借助于服务器部署) 三 lite-server介…...
深度优先搜索算法思想,题型总结与题目清单(不断更新)
深度优先搜索 深度优先搜索(Depth-First Search,简称DFS)是一种用于遍历或搜索树或图的算法。这个名称直接来自于这个算法的操作方式:它沿着某一路径深入遍历直到无法继续,然后再回溯进行下一条路径的遍历。 DFS的主要…...

网页三剑客之 CSS
css 在这里不会介绍太多,我们主要重点介绍两个:选择器和盒子模型就够用了。这里看个乐就好了,没有那么多重点,只是简单的认识一下下CSS。 CSS 是什么 CSS 是层叠样式表 (Cascading Style Sheets)的缩写它存在的意义就是…...
Maven(1)--- Maven入门指南
当然,我可以为你提供Maven的详细介绍,并按照6篇文章的方式进行详细展开。下面是第一篇的内容,采用Markdown格式输出: Maven入门指南 什么是Maven? Maven是一个强大的项目管理工具,被广泛应用于Java项目开…...

C# 实现 Websocket通讯聊天 (管用、超好使,点个赞)
1、背景 WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器…...

知识点回顾(一)
1.final,finally ,finalize final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final&…...

verflow属性的常用值详解
什么是overflow 在CSS中,overflow是“溢出”的意思,该属性规定当内容溢出元素框时发生的事情,设置内容是否会被修剪,溢出部分是否会被隐藏;例如当属性值设置为“visible”则内容不会被修剪,为“hidden”则内…...
算法怎么算:贪心算法
总有人在小白面前说:我是搞算法的,不是码农。又或者在想要进阶的时候,有人问你:你懂算法吗? 所有,算法到底是什么? 从目的性来说:它是计算方法,用来达到自己目的的方式…...

【UDS】ISO15765-2之网络时间参数
文章目录 简介分类1. N_As2. N_Ar3. N_Bs4. N_Br5. N_Cs5. N_Cr 总结 ->返回总目录<- 简介 网络层定时参数定义了N_As、N_Ar、N_Bs、N_Br、N_Cs、N_Cr六个参数。 这些时间参数在多帧传输中可以定义在下图的过程中 分类 1. N_As 方向: 发送方->接收方 …...
Mybatis 动态SQL
注解作用SelectProvider动态查询SQLInsertProvider动态新增SQLUpdateProvider动态更新SQLDeleteProvider动态删除SQL Select 与 SelectProvider 只是在定义注解的方式上有所不同, 一个是静态SQL, 一个是动态SQL 。 SelectProvider 是 MyBatis 中的一个注解,用于指定…...
普通二本院校计算机专业应届生,我来分享java后端开发的自学java经历
当我找到实习的时候,就决定要把自己的经验分享给大家。我会分享一下自己的真实经验。当然了,以下内容仅代表我的个人看法,如有不完善的地方还请见谅。接下来我就以下几个方面进行讲解。下面是兴哥的一位粉丝朋友的经历。 1.自我介绍 首先呢…...
windows系统常见的操作命令及用法
来源:用ChatGPT搜索出来的 目录操作命令: dir:查看当前目录下的文件列表。 用法:dir [路径] [/w] [/p] [/a] [/o] cd:切换当前目录到指定路径。 用法:cd [路径] md/mkdir:创建新的目录。 用法…...

【计算机网络】网络命令的使用
文章目录 一、实验目的二、实验工具三、实验要求四、实验过程01 ping 命令的使用应用1:验证本地计算机上是否正确安装了 TCP/IP 协议应用2:测试某个目的主机可达性应用3:键入 ping,查看 ping 的其他参数含义 02 netstat 命令的典型…...
当互联网与产业的融合成为一种必然,平台化和商业化不再是必然
当互联网与产业的融合成为一种必然,我们在互联网时代司空见惯的平台化、中心化的发展模式便开始被瓦解。更为确切地说,经典意义上的平台化和中心化的商业模式不再有存在的必要。因为供求两端的对接不再是依靠平台和中心的撮合和中介来实现的,…...

【linux】冯诺依曼体系+操作系统
我们使用的计算机都是由一个个硬件所组成的,那么如何有条不紊的运行呢?那是因为有冯诺依曼体系约束着硬件,而操作系统来管理着他们,从而使得计算机的硬件和软件完美结合。 一、冯诺依曼体系 首先我们得了解什么是冯诺依曼体系结构…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...

VSCode 没有添加Windows右键菜单
关键字:VSCode;Windows右键菜单;注册表。 文章目录 前言一、工程环境二、配置流程1.右键文件打开2.右键文件夹打开3.右键空白处打开文件夹 三、测试总结 前言 安装 VSCode 时没有注意,实际使用的时候发现 VSCode 在 Windows 菜单栏…...