一、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动作。

对于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

什么是状态机?一篇文章就够了_挣扎着的咸鱼的博客-CSDN博客_状态机的概念

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

OpenGL状态机_LV小猪精的博客-CSDN博客_opengl 状态机

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

【OpenGL学习】OpenGL介绍相关推荐

  1. OPenGL学习--库介绍

    文章目录 一.什么是OpenGL 二.OpenGL的由来 三.工具库 3.1.窗口管理 3.2.glut 3.3.freeglut 3.4.glfw 3.5.函数加载 3.6.glew 3.7.gla ...

  2. OpenGL学习(一)OpenGL基本介绍

    1. OpenGL基本介绍 1.1 OpenGL是什么?   当你第一次听到OpenGL时,你可能并不知道它到底是什么,但你应该知道它是与图形联系起来,这确实是OpenGL能够做的事情.OpenGL不 ...

  3. 学习opengl官方指南 01 opengl介绍

    申明:翻译的不好,勿喷,轻喷. 本章的目标 1. 可以知道opengl一些常见的专有名词 2. 识别不同级别的渲染复杂度 3. 理解opengl的命令语法 4. 知道opengl管段渲染的系列操作 5 ...

  4. 【我的OpenGL学习进阶之旅】介绍一下 绘制图元

    目录 一.绘制图元 1.1 `glDrawArrays` 1.1.1 `glDrawArrays`API说明 1.1.2 `glDrawArrays`API示例 1.2 `glDrawElements ...

  5. OpenGL学习---1.1 OpenGL基本介绍

    前记:非常有乐趣,学!!!-------------------------------博主:mx 核心模式与立即渲染模式 立即渲染模式(Immediate mode,也就是固定渲染管线): 优点:这 ...

  6. OpenGL学习----基本概念-OpenGL介绍

    1. 基本概念 1.1 OpenGL介绍 1.1.1 概述 OpenGL(英语:Open Graphics Library,译名:开放图形库或者"开放式图形库")是用于渲染2D.3 ...

  7. OpenGL学习之路(二)

    1 引子 在上一篇读书笔记中,我们对书本中给出的例子进行详细的分析.首先是搭出一个框架:然后填充初始化函数,在初始化函数中向OpenGL提供顶点信息(缓冲区对象)和顶点属性信息(顶点数组对象),并启用 ...

  8. opengl学习笔记 (一)

    opengl是调用大量的图形API,这些函数封装好了对于硬件的操作. 绘制窗口 学习opengl,GLUT是负责其中的窗口交互等事件. glutInit(&argc,argv); glutIn ...

  9. OpenGL学习笔记--配置VS环境

    OpenGL简介 OpenGL(Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口的规格,它用于三维图象(二维的亦可).OpenGL是个专业的图形程序接口,是一个功 ...

  10. OpenGL学习笔记:矩阵变换

    文章目录 缩放 glm矩阵表示 glm缩放矩阵实现 位移 齐次坐标 glm位移矩阵实现 旋转 沿x轴旋转 沿y轴旋转 沿z轴旋转 沿任意轴旋转 glm旋转矩阵实现 矩阵的组合 glm矩阵组合使用 接上 ...

最新文章

  1. 用户不在 sudoers文件中,此事将被报告。
  2. [旧稿]How To Add Simple Install WebPart Menu to the Right Click On a CAB File
  3. guid mysql_关于MySQL:MySQL-如何搜索GUID
  4. IOS libxml/tree.h file not found 解决方案
  5. 经营你的iOS应用日志(二):异常日志
  6. exchange2010 取消OWA内更改密码选项
  7. vscode 调试 PHP 打造PHP本地开发环境
  8. 移除collection中元素的注意事项(应用collection.remove移除元素造成的错误)
  9. jQuery中find和filter的区别
  10. 如何格式化写保护的U盘(删除多个盘的U盘)
  11. 基于单片机的智能窗帘系统设计(#0408)
  12. 华为od与中软外包哪个更好_真惨!入职中软一个月(外包华为)就离职了~
  13. C++之enum与switch
  14. 单向链表和双向链表的优缺点及使用场景
  15. RK3399平台开发系列讲解(IIO子系统)4.43、IIO数据的获取方式介绍
  16. Microsoft Product Support's Reporting Tools
  17. ORACLE连接不上 Linux网络 端口 问题判断
  18. JavaPoet 的使用
  19. C++:getenv setenv -- 获取设置系统环境变量
  20. 中e管家婚后有孩子怎么理财

热门文章

  1. php黑名单,PHP 数组黑名单/白名单实例代码详解
  2. 课堂演讲之《遵纪守法》
  3. Xshell+Xftp 安装
  4. 一加手机将与 OPPO 全面融合
  5. 如何将double类型的数据转换成String类型
  6. android卡点视频教程,剪映怎么制作卡点视频?剪映app卡点教程
  7. FTP下用reget实现断点续传 (FTP下get显示进度)
  8. DOS版环球经典游戏全集 1
  9. 浙江工商大学金融作业报告加代码
  10. oracle exp根据条件,oracle exp导出加上过滤条件