OpenGL ES基础理论 (一) —— 缓存、帧缓存、上下文与坐标系等

版本记录

版本号 时间
V1.0 2018.01.10

前言

OpenGL ES这种图形库的使用,由于底层C函数比较多,理论也更偏向于底层和硬件GPU,所以使用起来代码可能你都见过,顺序也知道改怎么做,但是还是多少会有点感觉不知道为什么这么做?具体有什么含义?接下来这几篇我们就一起来看一下OpenGL ES基础理论,一起学习一下相关的基础理论。

OpenGL ES与硬件组件的关系

程序会将3D场景数据保存到硬件RAM中,嵌入式系统的中央处理单元有专门为其分配的RAM,在图形处理的过程中,GPU也有专门为其分配的RAM,使用现代硬件渲染3D图形的速度几乎弯完全取决于不用的内存区块被访问的方式。

先看一下下图。

OpenGL ES 是 一 种 软 件 技 术。OpenGL ES 部分运行在 CPU 上,部分运行在 GPU 上。 OpenGL ES 横跨在两个处理器之间,协调两个内存区域之间的数据交换。上图中箭头代表了与3D渲染相关硬件组件之间的数据交换,每个箭头也代表着一个渲染性能的瓶颈。

从一个内存区域复制数据到另一个内存区域速度是相对较慢的。更糟糕的是,除非非常小心,在内存复制发生的时候 GPU 和 CPU 都不能把内存另作它用。因此内存区域之间的数据交换需要尽量避免。

最新的 OpenGL ES 为了支持新改进的方法抛弃了对于旧式的低效的内存复制操作的支持。


提供数据的最好方式 —— 缓存

OpenGL ES 为两个内存区域间的数据交换定义了缓存(buffers)的概念。缓存是指图形处理器能够控制和管理的连续 RAM。程序从 CPU 的内存复制数据到 OpenGL ES 的缓存。在 GPU 取得一个缓存的所有权以后,运行在 CPU 中的程序理想情况下将不 再接触这个缓存。通过控制独占的缓存,GPU 就能够尽可能以最有效的方式读写内存。 图形处理器把它处理大量数据的能力异步同时地应用到缓存上,这意味着在 GPU 使用 缓存中的数据工作的同时,运行在 CPU 中的程序可以继续执行。

几乎所有的程序提供给GPU的数据都应该放入缓存中,为缓存提供数据,需要如下7个步骤:

    1. 生成(Generate): 请求OpenGL ES为图形处理器控制的缓存生成一个独一无二的标识符。
    1. 绑定(Bind): 告诉OpenGL ES为接下来的运算使用一个缓存。
    1. 缓存数据(Buffer Data):让 OpenGL ES 为当前绑定的缓存分配并初始化足 够的连续内存(通常是从 CPU 控制的内存复制数据到分配的内存)。
    1. 启用(Enable)或者禁止(Disable):告诉 OpenGL ES 在接下来的渲染中是否使用缓存中的数据。
    1. 设置指针(Set Pointers): 告诉 Open-GL ES 在缓存中的数据的类型和所有需 要访问的数据的内存偏移值。
    1. 绘图(Draw):告诉 OpenGL ES 使用当前绑定并启用的缓存中的数据渲染 整个场景或者某个场景的一部分。
    1. 删除(Delete):告诉 OpenGL ES 删除以前生成的缓存并释放相关的资源。

理想情况下,每个生成的缓存都可以使用一个相当长的时间。下面看一下上面几个步骤的OpenGL ES的C语言函数的实现。

  • glGenBuffers() — 请求 OpenGL ES 为图形处理器控制的缓存生成一个独一无二 的标识符。
  • glBindBuffer() — 告诉 OpenGL ES 为接下来的运算使用一个缓存。
  • glBufferData()或者 glBufferSubData() — 让 OpenGL ES 为当前绑定的缓存分配 并初始化足够的连续内存(通常是从 CPU 控制的内存复制数据到分配的内存)。
  • glEnableVertexAttribArray()或 者glDisableVertexAttribArray() — 告 诉 OpenGL ES 在接下来的渲染中是否使用缓存中的数据。
  • glVertexAttribPointer() — 告诉 OpenGL ES 在缓存中的数据的类型和所有需要
    访问的数据的内存偏移值。
  • glDrawArrays() 或 者 glDrawElements() — 告 诉 OpenGL ES 使 用 当 前 绑 定 并启用的缓存中的数据渲染整个场景或者某个场景的一部分。
  • glDeleteBuffers() — 告诉 OpenGL ES 删除以前生成的缓存并释放相关的资源。

帧缓存

GPU 需要知道应该在内存中的哪个位置存储渲染出来的 2D 图像像素数据。就像 为 GPU 提供数据的缓存一样,接收渲染结果的缓冲区叫做帧缓存(frame buffer)。程 序会像任何其他种类的缓存一样生成、绑定、删除帧缓存。但是帧缓存不需要初始 化,因为渲染指令会在适当的时候替换缓存的内容。帧缓存会在被绑定的时候隐式开 启,同时 OpenGL ES 会自动地根据特定平台的硬件配置和功能来设置数据的类型和偏移。

可以同时存在很多帧缓存,并且可以通过 OpenGL ES 让 GPU 把渲染结果存储到 任意数量的帧缓存中。但是,屏幕显示像素要受到保存在前帧缓存(front frame buffer) 的特定帧缓存中的像素颜色元素的控制。程序和操作系统很少会直接渲染到前帧缓存中,因为那样会让用户看到正在渲染中的还没渲染完成的图像。相反,程序和操作系统 会把渲染结果保存到包括后帧缓存(back frame buffer)在内的其他帧缓存中。当渲染后的后帧缓存包含一个完成的图像时,前帧缓存与后帧缓存几乎会瞬间切换。后帧缓存会变成新的前帧缓存,同时旧的前帧缓存会变成后帧缓存。


OpenGL ES上下文

用于配置 OpenGL ES 的保存在特定平台的软件数据结构中的信息会被封装到一个 OpenGL ES 上下文(context)中。上下文中的 信息可能会被保存在 CPU 所控制的内存中,也可能会被保存在 GPU 所控制的内存中。 OpenGL ES 会按需在两个内存区域之间复制信息,知道何时发生复制有助于程序的优化。


OpenGL ES坐标系

OpenGL ES 总是开始于一个矩 形的笛卡儿坐标系,如下图所示。

OpenGL ES 坐标是以浮点数来存储的。现代 GPU 对浮点运算做了专门的优化,即 使是使用其他数据类型的顶点也会被转换成浮点值。

后记

未完,待续~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容