1、版本发展

1 opengl的版本区别
1.1 opengl1.1
       1995年,SGI推出了更为完善的OpenGL 1.1版本。OpenGL 1.1的性能比1.0版提高甚多。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。
1.2 opengl1.3
      2001年8月,ARB发布OpenGL 1.3规范,它增加了立方纹理贴图、纹理环境、多重采样、纹理框架压缩等扩展指令,但是改进程度非常有限。 
1.3 opengl1.4
     2002年7月,ARB正式发布OpenGL 1.4,它也只加入了深度纹理/阴影纹理、顶点设计框架、自动纹理贴图等简单的功能。 
1.3 opengl1.5
     2003年的7月,ARB公布OpenGL 1.5规范。OpenGL 1.5内包含ARB制定的“正式扩展规格绘制语言”(OpenGL Shading Language v1.0),该语言用于着色对象、顶点着色、片断着色等扩展功能,同时也将作为下一代OpenGL 2.0版本的内核。OpenGL 1.5的变化还增加了顶点缓冲对象(可提高透视性能)、非乘方纹理(可提高纹理内存的使用效率)以及阴影功能、隐蔽查询功能等等。其主要内容包括

  • 顶点Buffer Object:进行顶点配列方式可以提高透视性能
  • Shadow功能:增加用来比较Shadow映射的函数
  • 隐蔽查询(QUERY):为提高Curling性能采用非同步隐蔽测试
  • 非乘方纹理(Texture):提高mipmap等纹理内存的使用效率
  • OpenGL Shading Language v.1.0:用于着色(shader)对象、顶点着色以及片断着色技术(fragment shader )的扩展功能

1.4 opengl2.0
    OpenGL 1.0推出后的相当长的一段时间里,OpenGL唯一做的只是增加了一些扩展指令集,这些扩展指令是一些绘图功能,像是ClearCoat、Multisample、视频及绘图的整合工具(某些是通过OpenML的努力而开发出来的,它本身属于OpenGL ARB扩展指令之一。OpenGL 2.0将在OpenGL 1.3基础上进行修改扩充、但它将有下面五个方面的重大改进:①复杂的核心被彻底精简;②完全的硬件可编程能力;③改进的内存管理机制、支持高级像素处理;④扩展至数字媒体领域,使之跨越高端图形和多媒体范畴;⑤支持嵌入式图形应用。为了在获得强大功能的同时保持理想的兼容性,OpenGL 2.0又经历以下两个发展阶段:第一个阶段注重兼容能力和平滑过渡,为此,OpenGL 2.0核心将在精简后的OpenGL 1.3功能模块的基础上加上可完全兼容的新功能共同组成,这种做法在满足兼容性的同时,还可将原有OpenGL中数量众多、且相互纠缠不清的扩展指令进行彻底精简。 第一阶段的任务只是为了过渡,而第二阶段才是OpenGL 2.0的真正成熟期。此时,ARB将合成出一个“纯OpenGL 2.0”内核,纯内核将包含更多新增加的“精简型API函数”,这些函数具有完全的可编程特性、结构简单高效、功能强大且应用灵活。除了完成这项任务外,ARB组织还得指导开发商抛弃繁琐的OpenGL 1.X、转用更具弹性的“纯OpenGL 2.0”。

1.5 opengl3.0及opengl3.1

OpenGL3.0规范已于2008年8月发布,OpenGL3.0于微软DirectX 10有不少相近之处du,比如增加几何着色渲染,整数指令集,统一缓存,原生支持非线性色彩空间等,而且需要DirectX 10级别的显卡支持。与之不同的是,OpenGL3.0具有较强的跨平台运行优势,它不仅能运行在Windows Vista系统上没,还能运行在Windows XP甚至是Linux平台上。相对于DirectX 10只能在Windows Vista上运行,这确实是一个不小的优势。

在OpenGL 3.0规范发布七个多月之后,Khronos Group今天又公布了升级版新规范OpenGL 3.1,也是这套跨平台免费API有史以来的第九次更新。OpenGL 3.1将此前引入的OpenGL着色语言“GLSL”从1.30版升级到了1.40版,通过改进程序增强了对最新可编程图形硬件的访问,还有更高效的顶点处理、扩展的纹理功能、更弹性的缓冲管理等等。宽泛地讲,OpenGL 3.1在3.0版的基础上对整个API模型体系进行了简化,可大幅提高软件开发效率。

OpenGL 3.1主要新特性:

  • Texture Buffer Objects(纹理缓冲对象)、
  • Uniform Buffer Objects(统一缓冲对象)、
  • Signed Normalized Textures(符号正常化纹理)、
  • Primitive Restart(基本元素重启)、
  • Instancing(实例化)、
  • CopyBuffer API(拷贝缓冲接口)……

与OpenGL 3.1规范同步,OpenGL架构评审委员会(ARB)也发布了一个兼容性扩展,能让开发人员在访问OpenGL 3.1里已经删除的OpenGL 1.x/2.x功能,确保应用程序的全面向下兼容性。OpenGL 3.1公布后,业界图形厂商很快予以了大力支持。

1.6 OpenGL 4.0 :

时间来到2010年三月,这个版本和OpenGL 3.3同时发布,增加了令人兴奋的Tessellation Shader;Shader Language 4.00的subroutine提供了在运行时刻不需要切换着色器或者是重新编译或者使用if判断选择不同功能的方法,降低了切换着色器程序所带来的巨大开销(切换着色器的CPU循环消耗真的非常的惊人);另外GL_ARB_draw_buffers_blend让fragment shader输出的每条buffer都可以完成各自的pre-fragment operaion,而不是像过去那样每条都完成相同的pre-fragment operation;GL_ARB_transform_feedback2和GL_ARB_transform_feedback3提供了transform feedback object,以及transform feedback相关的控制(比如pause之类),也把transform feedback当做一个对象来进行处理。

主要的新功能包括

  • 新的着色阶段,可以由GPU进行几何嵌饰(tessellation),减轻CPU负担
  • 每采样片段着色器,及可编程的片段着色器输入位置,提升了渲染质量和保真灵活性
  • 可以绘制OpenCL和自身生成的数据,无需CPU干预
  • 着色子例程,显著提升编程灵活性
  • 通过新增的采样对象(sampler object)将纹理状态和纹理数据分离
  • 在着色中支持64位双精度浮点数
  • 性能上的改善,包括实例化几何着色器、实例化数组和新的计 时器查询

1.7 OpenGL 4.6 

        2017年,Khronos Group标准组织终于将OpenGL标准规范从4.5版升级到了4.6版——版本号变化不大,但新东西还是很多的。OpenGL 4.6的最大变化就是支持SPIR-V,一种用于GPU通用计算和图形学的中间语言,Khronos开发设计,最初是为OpenCL规范准备的,和下一代图形标准Vulkan差不多同时提出,也在不断发展完善。OpenGL 4.6标准将SPIR-V着色器整合在了核心规范中,可以确保得到广泛的支持。同时,新标准还增加了大量的ARB、EXT扩展,包括GL_ARB_gl_spirv、GL_ARB_indirect_parameters、GL_ARB_pipeline_statistics_query、GL_ARB_texture_filter_anisotropic、GL_ARB_polygon_offset_clamp、GL_ARB_shader_atomic_counter_ops、GL_KHR_no_error、GL_KHR_parallel_shader_compile、WGL_ARB_create_context_no_error、GXL_ARB_create_context_no_error。这些扩展由Khronos、AMD、Intel、NVIDIA联合创建,会得到各家显卡的普遍支持。此外,OpenGL标准一如既往地开放,OpenGL、OpenGL ES都新增了不少可以与DirectD、Vulkan合作、互通的扩展,包括GL_EXT_memory_object、GL_EXT_memory_object_fd、GL_EXT_memory_object_win32、GL_EXT_semaphore、GL_EXT_semaphore_fd、GL_EXT_semaphore_win32、GL_EXT_win32_keyed_mutex。

2、OpenGL 基本概念

opengl的学习资料比较散乱,初学者常常被各类概念和缩写弄得头晕眼花,就算是广为流传的《red book》 《编程指南》也对这些概念一笔带过。本文打算先梳理一些常见的概念、词汇,为后面的学习扫除障碍。

OpenGLES 与 EGL

通过osg来学习opengl的同学,是不是一开始就被cmake的界面上一堆的陌生编译选项给吓住了 ^@^啥是OpenGL ES?

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,各显卡制造商和系统制造商来实现这组 API。

看概念就很简单,就是嵌入式开发才会用到的Opengl.  开发桌面应用的同学可以心安地跳过啦:)

管线

可以将opengl的整个系统通俗地理解为一部机器,更确切地比喻为一台流水线机器。在机器的源头,我们输入各类几何坐标数据、图像数据,在机器的终端(通常是显示屏),输出我们想要的三维模型。那么我们很自然地把opengl这台机器的处理流程想象成“管线”,管线种输入 的原材料经过管线上的每一个都要做一次处理,然后将处理结果再送往下一个节点。OpenGL 中有两种流水线,一种是固定流水线,另外一种则是可编程流水线。其中,OpenGL 1.0 版本支持固定流水线。从OpenGL 2.0版本开始,OpenGL支持可编程的流水线。也就是说,程序员可以通过Shader(一种程序)来控制GPU渲染的过程。

对于初学者,我们没有必要一开始就细致深入探究两种管线的差评,需要理解的是:可编程管线在处理流程上比固定管线更加灵活,在处理能力上,由于充分利用了图形计算卡(GPU或其它显卡)的计算资源比固定管线更为强大,可实现一些固定管线无法实现的特效(这对游戏和一些物理仿真很重要)。

Context(Profile)

什么是context?

OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。在OpenGL 3.0版本之前,OpenGL创建Context都是一致的,随着升级会新增一些内容(例如从OpenGL1.1升级到1.5,会新增一些状态变量或者属性,并添加一些设置这些内容的函数),整体上来说没有什么大的变化。但是从OpenGL 3.0开始,OpenGL为了摆脱历史的“包袱”,想要彻底的废弃掉之前的许多特性,但是无奈市面上已经有大量依赖OpenGL之前版本的代码,导致OpenGL维护小组的这一想法难以付诸实施,于是在OpenGL 3.1开始引入了OpenGL Context的一些分类,比如引入了CoreProfile等概念,之后随着版本发展到3.3,一切算是确定下来。正是由于OpenGL的这一变化过程以及其间引入的各种概念,导致初学者学习OpenGL时非常的痛苦,本来OpenGL API对于一般开发者来说就是晦涩难懂,如今还引入这些内容真的是令开发者压力山大。

在OpenGL 3.0版本之前,所有的OpenGL Context是统一的,都是一种兼容之前版本的模式(例如使用OpenGL 1.1编写的代码,在支持OpenGL 2.1的设备上可以正常的运行)。这些版本的OpenGL API也被称之为固定管线(相比较之后引入shader的可编程管线来说), 但是从3.0开始有了变化:

  • 1、 OpenGL 3.0 引入了废弃机制,标记了许多OpenGL的函数是废弃的(但是3.0并没有真正移除它们,也就是说3.0版本仍然是一个可以向后兼容的Context)
  • 2、 OpenGL 3.1发布删除了之前3.0标记的过时函数(固定管线相关的函数),但是为了之前的OpenGL代码可用, 引入了一个扩展ARB_compatibility,这个扩展可以让OpenGL 3.1支持之前的OpenGL固定管线的内容。
  • 3、在OpenGL 3.2中正式引入了模式的概念(Profile),模式就将二者分离开来了。OpenGL 3.2 中模式包括:

Core Profile 只包含最新的Shader相关的函数,程序必须使用Shader编写。

compatibility Profile 可以兼容之前的OpenGL固定管线的内容,也可以使用Core Profile中的内容这样分开之后,开发者可以显式的要求创建某一种Profile来使用。

ARB

SGI发起成立了“OpenGL架构委员会”(OpenGL Architecture Review Board,简称ARB)来共同管理和推广这项先进的标准,OpenGL后继标准的制定权也逐渐转移给ARB组织。在ARB内部,产生新标准的过程非常民主化:各成员以投票的方式来决定新版OpenGL标准应具有的功能特性,并据投票结果制作正式标准文档,各软硬件厂商再根据这份标准文档的内容在自己的系统上实现;而所有的OpenGL版本都必须通过文档规定的全部测试项目方能生效。ARB组织的成员都非泛泛之辈,其核心成员包括SGI、3Dlabs、Intel、IBM、nVIDIA、ATi、Microsoft、Apple等业界领袖。

不清楚这个名词的来历,并不会阻碍你编程,但是翻看其它人写的开源代码(例如OSG等)会发现很多函数都使用了以ARB为前缀的扩展API, 心中难免会疑惑,(这是个什么鬼)。了解这个概念后心中了然:这就是ARB构建委员会认可的一个扩展(经过大佬们认定的扩展,很可能在下一版本的升级中会收录到core profile哦 :)

EGL

什么是 EGL?

EGL 是 OpenGL ES 渲染 API 和本地窗口系统(native platform window system)之间的一个中间接口层,它主要由系统制造商实现。EGL提供如下机制:

  • 与设备的原生窗口系统通信
  • 查询绘图表面的可用类型和配置
  • 创建绘图表面
  • 在OpenGL ES 和其他图形渲染API之间同步渲染
  • 管理纹理贴图等渲染资源

为了让OpenGL ES能够绘制在当前设备上,我们需要EGL作为OpenGL ES与设备的桥梁

使用 EGL 绘图的基本步骤

  • Display(EGLDisplay) 是对实际显示设备的抽象。
  • Surface(EGLSurface)是对用来存储图像的内存区域
  • FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer。Context (EGLContext) 存储 OpenGL ES绘图的一些状态信息。

使用EGL的绘图的一般步骤:

  1. 获取 EGL Display 对象:eglGetDisplay()
  2. 初始化与 EGLDisplay 之间的连接:eglInitialize()
  3. 获取 EGLConfig 对象:eglChooseConfig()
  4. 创建 EGLContext 实例:eglCreateContext()
  5. 创建 EGLSurface 实例:eglCreateWindowSurface()
  6. 连接 EGLContext 和 EGLSurface:eglMakeCurrent()
  7. 使用 OpenGL ES API 绘制图形:gl_*()
  8. 切换 front buffer 和 back buffer 送显:eglSwapBuffer()
  9. 断开并释放与 EGLSurface 关联的 EGLContext 对象:eglRelease()
  10. 删除 EGLSurface 对象
  11. 删除 EGLContext 对象
  12. 终止与 EGLDisplay 之间的连接

OpenGL ES 和 EGL 的联系

一个类比的例子

我们来思考一下画家绘画的过程:首先要有一名懂得各种绘画技艺的画家,然后他需要一张画布,一些笔,一些颜料,一些辅助工具(尺、模板、橡皮、调色板等等),然后他在画布上绘制第一幅画,完成之后展示给人们看;在人们观赏第一幅画的时候,他可以在第二张画布上绘制第二幅画,绘制完成后收回第一幅画,将第二幅画展现给人们看;接着使用工具擦除第一幅画,在同一张画布上绘制第三幅画;周而复始,人们便看到了一幅接一幅的画。

对比 OpenGL ES/EGL,各要素的对应关系大体如下:

  • 画家:编程人员

  • 笔、颜料、辅助工具:OpenGL ES API

  • 画布:EGL 创建的 Surface

所以计算机绘画的本质就是选择图像显示的像素格式,申请一块内存(画布),填充像素(颜色),绘制完成之后,通知计算机显示到屏幕上(按比例发射RGB光),最终就看到了所绘制的画面。之所以要先选择像素格式,是因为无论是所申请内存的大小,还是硬件驱动解析这块内存的方式,都是由像素格式决定的。

to be continue

缓冲区(Buffers)

OpenGL 中主要有 3 种 Buffer:

  • 帧缓冲区(Frame Buffers) 帧缓冲区:这个是存储OpenGL 最终渲染输出结果的地方,它是一个包含多个图像的集合,例如颜色图像、深度图像、模板图像等。
  • 渲染缓冲区(Render Buffers) 渲染缓冲区:渲染缓冲区就是一个图像,它是 Frame Buffer 的一个子集。
  • 缓冲区对象(Buffer Objects) 缓冲区对象就是程序员输入到 OpenGL 的数据,分为结构类和索引类的。前者被称为“数组缓冲区对象”或“顶点缓冲区对象”(“Array Buffer Object”或“Vertex Buff er Object”),即用来描述模型的数组,如顶点数组、纹理数组等; 后者被称为“索引缓冲区对象”(“Index Buffer Object”),是对上述数组的索引。

GLSL

GLSL 是 OpenGL 的编程语言,全称 OpenGL Shader Language,它的语法类似于 C 语言。上面介绍管道概念的时候,我们提到可编程管线可以利用图形计算卡的计算资源,而GLSL正是程序开发者与图形计算卡进行交互的语言。

着色器程序(Shader)

Shader 是用GLSL编写的一段程序,在图形计算卡上执行。用来描述如何绘制(渲染),OpenGL 渲染需要两种 必须的Shader:Vertex Shader 和 Fragment Shader,现在新版本的OPENGL又添加了compute Shadre 和其它几个非必须的Shader,这个我们后面在来学习

  • 顶点着色器(Vertex Shader) 对于3D模型网格的每个顶点执行一次,主要是确定该顶点的最终位置
  • 片元着色器(Fragment Shader) 对光栅化之后2D图像中的每个像素处理一次。3D物体的表面最终显示成什么样将由它决定,例如为模型的可见表面添加纹理,处理光照、阴影的影响等等。

图元(Primitives)

在 OpenGL 的世界里,我们只能画点、线、三角形这三种基本图形,而其它复杂的图形都可以通过三角形来组成。所以这里的图元指的就是这三种基础图形:

  • :点存在于三维空间,坐标用(x,y,z)表示。
  • 线:由两个三维空间中的点组成。
  • 三角形:由三个三维空间的点组成。

光栅化(Rasterize)

在介绍光栅化之前,首先来补充 OpenGL 中的两个非常重要的概念:

  • 顶点(Vertex) 就是图形中顶点,一系列的顶点就围成了一个图形。
  • 片元(Fragment) 是三维空间的点、线、三角形这些基本图元映射到二维平面上的映射区域通常一个 Fragment 对应于屏幕上的一个像素,但高分辨率的屏幕可能会用多个像素点映射到一个 Fragment,以减少 GPU 的工作。

光栅化是把点、线、三角形映射到屏幕上的像素点的过程。

坐标系

opengl版本发展史及各种概念的厘清相关推荐

  1. OpenGL版本与硬件支持

    对于我这个菜鸟,本来想找找看看怎么升级下自己的OpenGL版本,自以为自己的OpenGL蛮高的,至少2.0以上吧,在这里看到了获得OpenGL版本号的方法,将代码转载如下: #include < ...

  2. OpenGL版本与OpenGL扩展机制

    1 opengl的版本区别(在opengl官方文档中有详细说明)     针对Opengl不同版本的升级是主要是扩展指令集.     现在版本是4.0啦 1.1 opengl1.1 1995年,SGI ...

  3. 计算机图形学 opengl版本 第三版------胡事民 第四章 图形学中的向量工具

    计算机图形学 opengl版本 第三版------胡事民 第四章  图形学中的向量工具 一   基础 1:向量分析和变换   两个工具  可以设计出各种几何对象 点和向量基于坐标系定义 拇指指向z轴正 ...

  4. Domino版本、维护版本和补丁程序概念

    大家好,才是真的好. 从业二十多年,对技术掌握得炉火纯青的人不少,但对Domino版本.维护版本和补丁程序的概念一无所知的人不多. 今天我们普及一下版本.维护版本和补丁的概念,能帮助管理和开发人员更加 ...

  5. android opengl版本太低,安卓模拟器opengl_安卓模拟器无法安装“系统opengl版本过低”的通用解决方法_安卓模拟器通用版_通用安卓模拟器...

    安卓模拟器无法安装"系统opengl版本过低"的通用解决方法 在安装安卓模拟器时,出现"系统opengl版本过低",下图提示,说明你的显卡暂不支持模拟器: 遇到 ...

  6. OpenGL版本查看

    本文代码摘自 如何查看OpenGL版本? gl和glut库提供了版本查看函数,只需要调用就可以了: #include<Windows.h> #include <stdio.h> ...

  7. 如何检测显卡类型和OpenGL版本?

    1.检测显卡类型(Windows): 1) 打开"运行"窗口. 2)输入 dxdiag 进入 DirectX诊断工具,即列出显卡信息. 2.查看OpenGL的版本(windows) ...

  8. 解决 docker 中 OpenGL 版本过低的问题

    0. 背景: 最近在升级 Cuda 的 docker, 在 docker 中运行 VTK 时,发现 Docker 中使用的 VTK 很慢. 查看 EGL 对应的 OpenGL 版本,发现版本过低,没有 ...

  9. android opengl版本,安卓模拟器无法安装系统opengl版本过低的通用解决方法

    在安装安卓模拟器时,出现"系统opengl版本过低",下图提示,说明你的显卡暂不支持模拟器: 遇到这个问题,主要是3种原因 1.你的电脑没有显卡 解决方案:这个问题若不换电脑硬件是 ...

最新文章

  1. 检查一棵二叉树是否为二叉查找树
  2. Java Review - 并发编程_锁的分类
  3. 「Ubuntu」系统常用命令
  4. ssh项目同时使用mysql跟sqlserver数据库_MSSQL_如何把sqlserver数据迁移到mysql数据库及需要注意事项,在项目开发中,有时由于项目 - phpStudy...
  5. android 获取monkey日志_Android压力测试:monkey压力测试实战
  6. treeset java_Java TreeSet Higher()方法与示例
  7. linux6添加chkconfig管理,Linux系统管理初步(七)系统服务管理、chkconfig与systemd 编辑中...
  8. The labor day's schedule and the rate of process
  9. C#中如何跨窗体传值
  10. matlab2014b下载 32位,matlab 2014b 32位
  11. 利用计算机软件优化设计畜禽饲料配方 excel软件优化畜禽饲料配方,利用Excel线性规划优化饲料配方【荐】.ppt...
  12. 铲除浏览器右键菜单中的QQ相关项目(转)
  13. 卡内基梅隆计算机专业,2019美国大学计算机科学专业排名TOP10一览 卡内基梅隆大学居...
  14. rtx2060为什么叫智商卡_作为世界上智商最低的狗种之一,中华田园犬是否“名副其实”?...
  15. ECCV2022 | 多任务SOTA模型!分割/深度/边界/显著图四项任务
  16. python立方根求解_计算python中的立方根
  17. centos 上搭建FC SAN
  18. 纯干货!埃森哲的大数据分析框架分享-part 1
  19. kab12.dll 病毒的分析
  20. c++ 与 数据结构 实现 《校园路径导航系统》

热门文章

  1. Spring中使用缓存时你应该知道的知识
  2. nginx 404 403等错误信息页面重定向到网站首页或其它事先指定的页面
  3. 花卉世界大观园和杂技之游
  4. 将简历挂到云服务器网站上记
  5. CentOS6.*安装gitolite
  6. 代码质量第5层-只是实现了功能
  7. SpringBoot巧用 @Async 提升API接口并发能力!
  8. 京东热点key探测系统发布,单机 QPS 提升至 37 万
  9. 闲鱼同城第三方对接架构设计
  10. 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端