为图形处理器提供数据

1、缓存:提供数据的最好方式

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

几乎所有程序提供给 GPU 的数据都应该放入缓存中。缓存存储的到底是几何数据、 颜色、灯光效果,还是其他信息并不重要。为缓存提供数据有如下 7 个步骤。

1)生成(Generate)— 请求 OpenGL ES 为图形处理器控制的缓存生成一个独一 无二的标识符。

2)绑定(Bind)— 告诉 OpenGL ES 为接下来的运算使用一个缓存。

3)缓存数据(Buffer Data)— 让 OpenGL ES 为当前绑定的缓存分配并初始化足 够的连续内存(通常是从 CPU 控制的内存复制数据到分配的内存)。

4)启用(Enable)或者禁止(Disable)— 告诉 OpenGL ES 在接下来的渲染中是 否使用缓存中的数据。

5)设置指针(Set Pointers)— 告诉 Open-GL ES 在缓存中的数据的类型和所有需 要访问的数据的内存偏移值。

6)绘图(Draw)— 告诉 OpenGL ES 使用当前绑定并启用的缓存中的数据渲染 整个场景或者某个场景的一部分。

7)删除(Delete)— 告诉 OpenGL ES 删除以前生成的缓存并释放相关的资源。

理想情况下,每个生成的缓存都可以使用一个相当长的时间(可能是程序的整个 生命周期)。生成、初始化和删除缓存有时需要耗费时间来同步图形处理器和 CPU。 存在这个延迟是因为 GPU 在删除一个缓存之前必须完成所有与该缓存相关的等待中 的运算。如果一个程序每秒生成和删除缓存数千次,GPU 可能就没有时间来完成任何 渲染了。

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 删除以前生成的缓存并释放相关的资源。

2、帧缓存

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

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

               

                      

              图 1-5 前帧缓存决定了屏幕上显示的像素颜色,同时会与后帧缓存切换

猜你喜欢

转载自www.cnblogs.com/jerryspace/p/11697978.html