【OpenGL学习】OpenGL介绍-程序员宅基地

技术标签: 学习  OpenGL  

一、OpenGL是什么?

在早期一般认为OpenGL是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)

二、OpenGL的两种渲染模式:

早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少有控制OpenGL如何进行计算的自由。而开发者迫切希望能有更多的灵活性。随着时间推移,规范越来越灵活,开发者对绘图细节有了更多的掌控。立即渲染模式确实容易使用和理解,但是效率太低。因此从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。

当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势是更高的灵活性效率,然而也更难于学习。立即渲染模式从OpenGL实际运作中抽象掉了很多细节,因此它在易于学习的同时,也很难让人去把握OpenGL具体是如何运作的。现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。

三、OpenGL是一个状态机

OpenGL本身是一个巨大的状态机,那么什么是状态机呢?最简单的理解方式就是当我们设置一个状态之后,不进行任何操作的情况下,将会一直保持该状态,直到接收到了其他输入之后根据输入来改变状态,以OpenGL举个例子,例如我们要进行颜色缓冲区的清空,调用了函数glClearColor,那么OpenGL会记录你输入的颜色值,每次刷新缓冲区都会显示这个颜色,直到你输入另外其他的颜色。而状态机就是来表示有限个状态和这些状态之间的转移和动作行为的数学计算模型。如下图,就定义了一个只有openedclosed两种状态的状态机。当系统处于opened状态,在收到输入“关闭事件”,达到了状态机转移条件,系统就转移到了closed状态,并执行相应的动作,此例有一个进入动作(entry action),进入closed状态,会执行close door动作。

img

对于OpenGL这个状态机来说,会有一系列的变量来描述OpenGL在某个时刻对应的状态,而这个状态被称之为上下文(Context),在进行初始化设置的时候通过函数glfwMakeContextCurrent()就是用来创建上下文的。通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。

当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数将会改变上下文。以及状态使用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作。

四、OpenGL的对象

在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以简单的将对象理解为一个结构体。

如何使用OpenGL的对象?

一般流程如下:

// 创建对象
unsigned int objectId = 0; //OpenGL中的对象都是用无符号整型来表示的
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId); //这里将创建的对象绑定到了上下文中设置Window参数的这个状态变量上面了
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0); //可以理解为解绑该对象

首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

而OpenGL渲染图形的整个过程,实际上就是渲染管线的内容了,包括了从应用阶段到几何阶段再到光栅化阶段的一系列操作。

参考:

OpenGL - LearnOpenGL CN (learnopengl-cn.github.io)

OpenGL - The Industry Standard for High Performance Graphics

Khronos OpenGL Registry - The Khronos Group Inc

什么是状态机?一篇文章就够了_挣扎着的咸鱼的博客-程序员宅基地_状态机的概念

OpenGL的状态机理解 - lyz007 - 博客园 (cnblogs.com)

OpenGL状态机_LV小猪精的博客-程序员宅基地_opengl 状态机

20分钟让你了解OpenGL——OpenGL全流程详细解读 - 知乎 (zhihu.com)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/miyazono_/article/details/128660864

智能推荐

Fiddler抓包工具使用详解_regex:(?insx)-程序员宅基地

文章浏览阅读372次。Fiddler抓包工具使用详解一、Fiddler简介Fiddler是最强大最好用的Web调试工具之一, 它能记录所有客户端和服务器的http和https请求。允许你监视、设置断点、甚至修改输入输出数据。Fiddler包含了一个强大的基于事件脚本的子系统,并且能使用.net语言进行扩展。换言之,你对HTTP 协议越了解,你就能越掌握Fiddler的使用方法。你越使用Fiddler,就越能帮助你了解H..._regex:(?insx)

快速理解HashSet重写hashCode和equals方法-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏18次。重写原因:1、HashSet是根据hashCode值来判断对象是否是同一个。2、hashCode不等,2个对象一定不等3、我们希望2个对象属性值都相同的时候,当成同一个对象,所有需要重写hashCode和equals方法(本质:根据对象属性的值来重写,保证属性值一样时,重写后的hashCode一定相同,equals方法一定为true)注:我们都知道,‘’比较两个引用是否指向同一个对象(实际..._set重写hashcode

hp服务器光盘安装win7系统安装教程,惠普win7系统安装方法,教您惠普win7系统怎么安装...-程序员宅基地

文章浏览阅读650次。惠普电脑是目前市场上比较大的一个电脑品牌之一,有着一定量的用户。为了让各位友友们能更好的使用惠普电脑,为了让这些惠普的用户在遇到无法解决问题时,需要操作系统重装时有经验可寻,下面,小编就来给大家带来了惠普win7系统安装方法。随着u盘装机方式的普及,相信大家对于u盘装系统都很熟悉了,即使没有安装系统也略有耳闻,因此用户对u盘安装 win7系统还是有些陌生,没关系,为了给大家提供安装的资源,下面小编..._hp ml350服务器如何安装win7

【工具杂谈】笔记类软件使用_笔记软件怎么用-程序员宅基地

文章浏览阅读279次。我们要学会利用各种软件工具来提升我们工作、生活、学习的效率!今天要分享的是笔记类工具,其中名气最大的当然是印象笔记、其他的还有有道云笔记、为知笔记、OneNote…这些都做的很不错的,在细节功能方面有些不同,后期会写一篇这些工具的对比横评,不过记得知乎里好像已经有人写过了,感兴趣可以去看下,我开始用的是印象笔记,后来改成用有道云笔记,主要感觉印象笔记还是有一点点的水土不服,有道云笔记是网易的,网易在教育这块做的还是不错的。首先说说这些笔记工具能干些什么?资料汇总(将各个网站的内容一键采集)工作素材库(_笔记软件怎么用

黑马程序员--使用ListView控件展示数据_黑马listview-程序员宅基地

文章浏览阅读726次。---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------一、图像列表控件1、ImageList控件的属性1> 定义图像列表控件是含有图像对象的集合,可以通过索引或关键字引用该集合中的每个对象。ImageList控件不能独立使用,只用来为Windows窗体中的其他控件提供图像2_黑马listview

react 实现一个无限循环的轮播器 附github地址-程序员宅基地

文章浏览阅读459次。一个简单的轮播为了更具有通用和参考性,轮播组件中,轮播只使用了react,没有添加其他的状态管理,或者参数类型限制的库. 所以这个轮播的方法,同样可以用于vue 等其他框架github地址最终效果显示无限循环原理如图所示,如果轮播里面有三个部分,那么可以在首端前添加一个跟最后一块一样的dom节点,同理在最末端添加跟首端相同的节点,这样当轮播到末端,在下一张的情况下,就可以无缝..._react carousel不暂停

随便推点

WPA2协议新攻击方法(KRACK)—WPA2密钥重安装漏洞_wpa2重装-程序员宅基地

文章浏览阅读1.3w次,点赞6次,收藏21次。Key Reinstallation Attacks Breaking WPA2 by forcing nonce reuse 今年9月份CCS公布了一篇新论文,该论文提出了一种新的攻击方法:Key Reinstallation Attacks,这种攻击方法对WPA2危害甚大。本文简单介绍该攻击方法。我们都知道所有WiFi网络都是靠WiFi Protected Access 协议的某个实现版_wpa2重装

【硬件工程师面经整理17_RC电路】_硬件工程师笔试常考电路-程序员宅基地

文章浏览阅读1.1k次,点赞27次,收藏22次。RC电路画一个RC电路,计算电容两端电压,画出电容电压时间曲线由电阻R和电容C组成的电路称为阻容电路,简称RC电路。从元件的连接的角度来看,又分RC串联电路与RC并联电路。_硬件工程师笔试常考电路

【面试题】组合和继承有什么区别_组合模式和继承模式区别-程序员宅基地

文章浏览阅读1.7k次。组合和继承是面向对象中两种代码复用的方式。组合是指在新类里面创建原有类的对象,重复利用已有类的功能。继承是面向对象的主要特性之一,它允许设计人员根据其他类的实现来定义一个类的实现。组合和继承都允许在新的类中设置子对象(subobject),只是组合是显式的,而继承是隐式的。组合和继承存在着对应关系:组合中的整体类和继承中的子类对应,组合中的局部类和继承中的父类对应。既然继承和组合都可以实现..._组合模式和继承模式区别

Flutter Widgets 之 FutureBuilder_flutter snapshot-程序员宅基地

文章浏览阅读1.2k次。展示异步任务状态当有一个Future(异步)任务需要展示给用户时,可以使用FutureBuilder控件来完成,比如向服务器发送数据成功时显示成功提示:var _future = Future.delayed(Duration(seconds: 3), () { return '老孟,一个有态度的程序员'; });FutureBuilder( future: _future, builder: (context, snapshot) { ._flutter snapshot

springboot/java/php/node/python西塘草舍农场管理系统【计算机毕设】-程序员宅基地

文章浏览阅读19次。后端由Spring Boot提供支持,前端由Vue.js构建,数据存储和管理通过MySQL和Navicat实现,整个开发流程由Maven进行管理,并在Tomcat服务器上运行。开发工具:idea/eclipse/myeclipse。环境配置软件: JDK1.8+Maven3.3.9。数据库管理工具:Navicat10以上版本。操作系统:win7以上,最好是win10。文末可领取本课题的JAVA源码参考。数据库:mysql5.7或8.0。服务器:Tomcat7.0。

电脑围棋-程序员宅基地

文章浏览阅读3.4k次。1.0 概述本文旨在向读者介绍电脑围棋领域的状况及 Internet 上的相关资源。 为照顾尚不熟悉围棋的读者,第2部分介绍了围棋的基本常识和规则,熟悉这些的读者可以跳过它,或在必要时参考。 第6部分将告诉读者,由于各自的特点,目前围棋程序的水平与国际象棋程序相比差距极大,有待于进一步投入力量开发;第3部分 给出了其理论和实践的依据,并指出围棋程序是不可能仿照国际象棋程序那样开发的(参见表一)。 _电脑围棋

推荐文章

热门文章

相关标签