一、OpenGL简介

  • OpenGL是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程规范
  • OpenGL包含一系列可以操作图形和图像的函数,但OpenGL没有实现这些函数,OpenGL仅规定每个函数应该如何执行以及其输出值(类似接口),所以OpenGL仅是一种严格的规范
  • OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定。实际的OpenGL库的开发者通常是显卡的生产商
  • OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其他输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,所以OpenGL允许跨平台开发
  • OpenGL没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作,也就是说,只要显卡驱动支持对GLSL的编译它就能运行,所以OpenGL能够跨平台
  • 核心模式与立即渲染模式:
    早期OpenGL使用立即渲染(Immediate mode,也就是固定渲染管线)容易使用和理解,但是效率太低。从OpenGL3.2开始废弃立即渲染模式,鼓励使用核心模式(Core-profile)。
    核心模式:要求使用者真正理解OpenGL和图形编程,有一些难度,然而提供了更多的灵活性,更高的效率,可以更深入理解图形编程。
  • 扩展:
    OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
  • 状态机:
    OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染
  • 对象:
    OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个
    使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可

二、OpenGL程序

 众所周知程序是运行在CPU上的,程序代码处于内存之中,在我们通常的理念中一般仅涉及CPU和内存,而使用OpenGL的渲染程序却有所不同,其涉及了GPU和显存,如下图所示:

从内存到显存

  • 我们的程序运行在CPU上,程序的数据储存在内存之中
  • 当我们需要渲染一个场景时,可能需要场景中物体的一些顶点数据、纹理数据、着色器参数等。这些数据是我们程序指定的,它们最初存储于外存中,当我们程序在CPU运行时我们将它们读入内存中
  • 显卡中有显存,这个缓冲区可以存储图形缓冲、深度缓存、纹理、顶点缓存等一系列渲染场景所需要的数据。利用这些数据,执行GPU的渲染指令,即可渲染我们想要的场景。
  • 那么问题来了,我们如何将内存中的数据传输到显存呢?
  • 毫无疑问这一切的答案都在OpenGL中,通过OpenGL有关函数,我们运行在CPU上的程序可以向显存中发送数据,将渲染场景所需的数据存储于显卡的显存缓冲区中

OpenGL渲染状态机

  • 当渲染所需数据已经传输到显存中时,我们如何执行GPU的渲染命令呢?
  • GPU的渲染指令是非常底层的,涉及显卡类型等硬件参数,这样复杂的指令让我们去调用是不可能的。但是我们有OpenGL。
  • 渲染是一套固定的流程,我们无法对接GPU的底层指令,那我们是否可以建立一个通用的、无关硬件的渲染模型呢?当然可以,这就是OpenGL。
  • 渲染是一个流程,这个过程中拥有很多可设置的选项,我们称这些选项为OpenGL的状态。所谓状态机,即拥有众多参数作为状态,当在不同的状态情况下会做出不同的反应,例如在不同的场景选项下呈现出不同的渲染结果。
  • OpenGL是一个完整的渲染状态机,Khronos组织制定并维护了OpenGL,换句话说:他们建立了OpenGL的状态机模型。这个模型是用于渲染的,它包含很多参数作为状态。针对这个模型,Khronos组织制定了OpenGL应该包含的函数,这些函数包括一些状态设置函数(State-changing Function)和状态应用函数(State-using Function)。使用状态设置函数可以改变OpenGL上下文即OpenGL的状态,使用状态应用函数会根据当前OpenGL的状态执行一些操作。
  • 如简介所说,OpenGL只是一个规范并没有具体的函数实现。如上文所说,OpenGL只是一个包含许多状态的渲染模型,其制定了一整套渲染所需的函数规范。那么我们如何搭建起OpenGL这个数学模型和GPU底层渲染指令间的桥梁呢?即OpenGL制定的函数该由谁实现呢?这通常是显卡开发商该思考的,显卡开发商针对OpenGL模型规范开发出具体显卡的OpenGL驱动程序,即在特定的OpenGL的状态下,显卡会执行特定的渲染指令
  • 如此一来,我们只需要和OpenGL这个通用的、和硬件无关的状态机进行交互,即可执行出我们所需的GPU渲染指令。而程序和OpenGL的交互无非是改变OpenGL的状态,例如设置OpenGL的选项,或操作缓冲区,通过调用状态设置函数实现。而执行渲染操作等行为通过状态应用函数实现。总之就是先设置渲染的状态,然后基于状态进行渲染操作。

三、GLFW和GLEW

 书接上文,OpenGL只提供渲染功能,核心API中没有创建窗口、键盘监听等输入概念,那么我们要进行渲染,肯定要把渲染后的画面呈现的电脑的窗口上,这该怎么办呢?
 使用GLFW即可,GLFW是一个跨平台的OpenGL应用框架,支持窗口创建,接受输入和事件等功能其成员以GLFW形式开头
 上文中提到扩展,当我们想要使用一个OpenGL函数时,需要查询当前平台是否支持这个函数,并且返回这个函数的指针。这毫无疑问是一件非常麻烦的事情,那么有什么方便的途径吗?
 使用GLEW即可,GLEW是一个基于OpenGL图形接口的跨平台的C++扩展库GLEW能自动识别当前平台所支持的全部OpenGL高级扩展涵数。只要包含glew.h头文件,就能使gl,glu,glext,wgl,glx的全部函数。GLEW支持目前流行的各种操作系统。其成员常常以gl开头。

四、其他

 本文参考并引用参考文章内容。
 本文内容仅为个人在OpenGL学习中的感想,如有不当之处请不吝赐教。

OpenGL入门教程之 深入理解相关推荐

  1. OpenGL入门教程(转)

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  2. 现代OpenGL入门教程

    目录 经典教程(国内可上的网站)及书籍推荐 报错笔记 VS2015配置GLFW库与GLAD库 第一个三角形与矩形(两个三角形) 基本图元(包括点.线.圆形等) 普通着色和Shader类(代码及使用方法 ...

  3. OpenGL入门教程-OpenGL介绍

    1. OpenGL简介 在开始这段旅程之前我们先了解一下OpenGL到底是什么.一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含 ...

  4. Oracle存储过程入门教程(通俗理解存储过程)

    Oracle存储过程入门通俗介绍 一.存储过程通俗理解 二.创建存储过程基本语法(汇总) 三.执行存储过程的方式(5种) 四.网上现有的创建存储过程的两种方式解释(看注释) 五.一些存储过程示例(仅供 ...

  5. OpenGL入门教程 - 01

    OpenGL使用的是管线的方式,利用GPU加速对简单的信息进行渲染,然后投影在屏幕上的方法,下图展示的就是信息在OpenGL里面的处理管线,Vertex信息由用户定义,保存在CPU中,随后在用户定义的 ...

  6. OpenGL-GLSL语言入门教程(1)

    目录 GLSL简介 GLSL的内建变量 顶点着色器变量 gl_PointSize gl_VertexID 片段着色器变量 gl_FragCoord gl_FragDepth 参考网站:LearnOpe ...

  7. 80篇各ajax框架入门教程

    AJAX经典入门教程,入门实例,入门代码收藏. *VS2008 Ajax.NET快速入门教程* (2008-3-25) [本站原创]Ajax!?!入门教程之道 (2008-4-13) [本站原创]Aj ...

  8. Fragstats官方入门教程3 批处理多个栅格

    原著:Kevin McGarigal 翻译:地理时政志(公众号.CSDN同名,知乎:Jarviski) 在教程3中,将会教读者如何使用Fragstats完成批处理多个栅格,以及其他要注意的问题 以下原 ...

  9. ROS2入门教程—理解话题(Topic)

    ROS2入门教程-理解话题(Topic) 1 启动小海龟仿真器 2 rqt_graph 3 ros2 topic list 4 ros2 topic echo 5 ros2 topic info 6 ...

最新文章

  1. 鸢尾花识别问题,萼片有什么用?
  2. XML和JSON两种数据交换格式的比较
  3. python变量名包括_Python – 获取全局范围内对象的所有变量名
  4. CSDN公众号新功能上线,居然还能搜出小姐姐???(文末有福利)
  5. 加速布局无服务器生态,腾讯云与Serverless.com达成全球战略合作!
  6. 华为交换机S3700清空配置方法
  7. 取消搜索状态_百度搜索引擎全网推广通常有哪些账户?
  8. 前端常用60余种工具方法(上)
  9. 【BZOJ1001】狼抓兔子,平面图转对偶图(从最小割到最短路)
  10. 【Python3爬虫】用Python中的队列来写爬虫
  11. 【OpenCV】图像平滑
  12. django+echarts+ajax异步+显示优化--基本例子
  13. BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
  14. python源码剖析笔记
  15. WinCE下Touch Panel驱动介绍 .
  16. 字节跳动 IconPark 免费图标库、阿里巴巴矢量图标库
  17. Feign原理:current list of Servers哪里来的
  18. 计算机组成原理-基本组成
  19. NEXTCHIP 内容介绍+应用场景+代理商信息
  20. 使用javax.imageio.ImageIO读取JPEG图片时出现异常java.awt.color.CMMException: General CMM error517

热门文章

  1. java毕业设计选题基于JavaWeb项目实现的高校学生在线选课系统
  2. 贤鱼的刷题日常【c++动态规划】4978:宠物小精灵之收服
  3. 霍夫变换c语言程序,霍夫变换 | Cauthy's Blog
  4. linux中一个用户可以同时属于多个组吗,为什么linux用户可以属于多个用户组,文件只能属于一个用户组?...
  5. IOS苹果开发者账号封号的规避心得,利用好防关联工具避免APP下架问题
  6. 傻瓜式文章一键伪原创工具
  7. 计算机硬盘对考,台式机怎样让进行硬盘对拷(快速批量装机) 台式机让进行硬盘对拷(快速批量装机)的方法...
  8. maven 本地仓库的配置以及如何修改默认.m2仓库位置
  9. php 发socket数据库,php socket连接数据库
  10. c语言yb,通达信逐笔委托标识(C、YB 、YS 、VS 、VB)等代表什么含义?