陈江川

邮箱:jiangchuanc@gmail.com

OpenGL ES 第一章

OpenGL ES中的内容和Demo均出自《OpenGL+ES应用开发实践指南:iOS卷》,Demo中我做了很详细的注释。

OpenGL ES的作用 - 缓存

OpenGL ES是一种软件技术。OpenGL ES运行在CPU上,部分运行在GPU上。OpenGL ES横跨在两个处理器之间,协调两个内存区域之间的数据交换


OpenGL ES为两个内存区域间的数据交换定义了缓存(buffers)的概念。缓存是指GPU能够控制和管理的连续RAM。程序从CPU的内存复制数据到OpenGL ES的缓存。在GPU取得一个缓存的所有圈以后,运行在CPU中程序理想情况下将不再接触这个缓存。


通过控制独占的缓存,CPU就能够尽可能以最有效的方式读写内存。GPU把它处理大量数据的能力异步同时地应用到缓存上,这意味着在GPU使用缓存中的数据工作的同时,运行在CPU中的程序可以继续执行。

为缓存提供数据的7个步骤:

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

对应的C函数

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

帧缓存

GPU需要知道应该在内存中的哪个位置存储渲染出来的2D图像像素数据。就像为GPU提供数据的缓存一样,接收渲染结果的缓冲区叫做帧缓存(frame buffer)


程序会像任何其他种类的缓存一样生成、绑定、删除帧缓存。但是帧缓存不需要初始化,因为渲染指令会在适当的时候替换缓存的内容。帧缓存会在绑定的时候隐式开启,同时OpenGL ES会自动地根据特定平台的硬件配置和功能来设置数据的类型和偏移。

OpenGL ES的上下文

用于配置OpenGL ES保存的信息会被封转到一个OpenGL ES上下文(context)中,这里的信息指:特定平台的软件数据结构中的信息。


OpenGL ES上下文会跟踪用于渲染的帧缓存。上下文还会跟踪用于几何数据、颜色等的缓存。上下文会决定是否使用某些功能,比如纹理和灯光。上下文还会为渲染定义当前的座标系统。

几何数据

坐标系

在为GPU提供数据时,很多种数据都可以省略,比如灯光信息和颜色。在渲染一个场景时,OpenGL ES必须具有的一种数据是用来指定要渲染的图形的几何数据。几何数据是相对于3D坐标系定义的。

确定一个用于 3D 图形的顶点需要3个坐标。
OpenGL ES 坐标是以浮点数来存储的 。

矢量

矢量是另一种诠释顶点数据的方式。矢量是既有方向又有距离的一个量。所有的顶点都可以用它相对于OpenGL ES坐标系原点({0, 0, 0})的距离和方向来定义。
下图中使用一个从原点到顶点{1.5, 3.0, -2.0}的实心箭头来描述矢量。

01-最简单的OpenGL-ES

« OpenGL ES 第二章 iOS集成ffmpeg静态库 »