版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.10.05 |
前言
OpenGL ES是一个强大的图形库,是跨平台的图形API,属于OpenGL的一个简化版本。iOS系统可以利用OpenGL ES将图像数据直接送入到GPU进行渲染,这样避免了从CPU进行计算再送到显卡渲染带来的性能的高消耗,能带来来更好的视频效果和用户体验。接下来几篇就介绍下iOS 系统的 OpenGL ES框架。感兴趣的可以看上面几篇。
1. OpenGL ES 框架详细解析(一) —— 基本概览
2. OpenGL ES 框架详细解析(二) —— 关于OpenGL ES
3. OpenGL ES 框架详细解析(三) —— 构建用于iOS的OpenGL ES应用程序的清单
4. OpenGL ES 框架详细解析(四) —— 配置OpenGL ES的上下文
5. OpenGL ES 框架详细解析(五) —— 使用OpenGL ES和GLKit进行绘制
6. OpenGL ES 框架详细解析(六) —— 绘制到其他渲染目的地
7. OpenGL ES 框架详细解析(七) —— 多任务,高分辨率和其他iOS功能
8. OpenGL ES 框架详细解析(八) —— OpenGL ES 设计指南
9. OpenGL ES 框架详细解析(九) —— 调整您的OpenGL ES应用程序
10. OpenGL ES 框架详细解析(十) —— 使用顶点数据的最佳做法
11. OpenGL ES 框架详细解析(十一) —— 并发和OpenGL ES
12. OpenGL ES 框架详细解析(十二) —— 采用OpenGL ES 3.0
13. OpenGL ES 框架详细解析(十三) —— Xcode OpenGL ES工具概述
14. OpenGL ES 框架详细解析(十四) —— 使用纹理工具压缩纹理
OpenGL ES 3.0 for Apple A7 GPUs and Later - 适用于Apple A7 GPU及更高版本的OpenGL ES 3.0
为获得最佳性能并访问现代GPU的所有功能,您的应用程序应使用Metal
。 但是,如果您的应用程序使用OpenGL ES,请使用OpenGL ES 3.0。 使用OpenGL ES 3.0可以访问新功能和更大的渲染资源池。
Best Practices - 最佳做法
这些最佳做法适用于Apple A7 GPU及更高版本的OpenGL ES 3.0应用程序:
- 避免由于先前提交的绘图命令修改已由渲染器使用的OpenGL ES对象的操作。 当您需要修改OpenGL ES资源时,请在帧的开头或结尾安排这些修改。 这些命令包括
glBufferSubData,glBufferData,glMapBuffer,glTexSubImage,glCopyTexImage,glCopyTexSubImage,glReadPixels,glBindFramebuffer,glFlush和glFinish
。 - 遵循OpenGL ES Programming Guide中的Do Not Sort Rendered Objects Unless Necessary 绘图准则。
Considerations - 考虑
Apple A7 GPU和稍后使用标量处理器处理所有浮点计算,即使这些值在向量中声明。 正确使用写掩码和仔细定义您的计算可以提高着色器的性能。 有关详细信息,请参阅执行矢量计算懒惰。
中等和低精度浮点着色器值的计算方式相同,为16位浮点值。 这是从PowerVR SGX
硬件的变化,它使用10位定点格式的低精度值。 如果您的着色器使用低精度浮点变量,并且还支持PowerVR SGX
硬件,则必须在两个GPU上测试着色器。
Apple A7 GPU及更高版本不会影响依赖纹理提取。
当您的帧缓冲区内容不再需要时,始终使用帧缓冲区丢弃操作。 不这样做的惩罚比早期的GPU更高。 为获得最佳效果,请使用GLKView
类; 它自动实现帧缓冲丢弃操作。
当渲染到多个目标时,将您的应用程序限制为四个图像目标(Apple A7 GPU
上的总数据不超过128位,并将Apple A8 GPU
的256位数据写入目标)。 单个sRGB
目标计数为64位。
Glossary - 相关词汇
该词汇表包含专门用于Apple OpenGL ES
实现的术语以及OpenGL ES图形编程中常见的术语。
-
aliased
- 图形边缘出现锯齿状; 可以通过执行抗锯齿操作来补救。
-
antialiasing
- 在图形中,一种用于平滑和软化锯齿状(或锯齿)边缘的技术,这些边缘在绘制图形对象(如文本,线条图像和图像)时有时是显而易见的。
-
attach
- 要建立两个现有对象之间的连接。 比较bind。
-
bind
- 创建一个新对象,然后在该对象和呈现上下文之间建立连接。 比较 attach。
-
bitmap
- 一个矩形的位数组。
-
buffer
- 由OpenGL ES管理的内存块,专用于存储特定类型的数据,如顶点属性,颜色数据或索引。
-
clipping
- 用于标识绘图区域的操作。 不在剪裁区域的任何东西都不会被画出来。
-
clip coordinates
- 用于视图卷裁剪的坐标系。 应用投影矩阵之后,在透视分割前应用剪辑坐标。
-
completeness
- 指示帧缓冲对象是否满足绘图要求的状态。
-
context
- 一组OpenGL ES状态变量,影响绘图如何执行到连接到该上下文的可绘制对象。 也称为渲染
context
。
- 一组OpenGL ES状态变量,影响绘图如何执行到连接到该上下文的可绘制对象。 也称为渲染
-
culling
- 消除观察者无法看到的场景的部分。
-
current context
- OpenGL ES路由您应用程序发出命令的渲染上下文。
-
current matrix
- OpenGL ES 1.1使用的矩阵将一个系统中的坐标转换为另一个系统的坐标系,如模型视图矩阵,透视矩阵和纹理矩阵。 GLSL ES使用用户定义的矩阵。
-
depth
- 在OpenGL中,z坐标指定像素距观察者多远。
-
depth buffer
- 用于存储每个像素深度值的内存块。 深度缓冲器用于确定观察者是否可以看到像素。 由OpenGL ES光栅化的所有片段都必须通过深度测试,将入侵深度值与存储在深度缓冲区中的值进行比较; 只有通过深度测试的片段才能存储到帧缓冲区。
-
double buffering
- 使用两个缓冲区来避免图形子系统的两个不同部分之间的资源冲突的做法。 前端缓冲区由一个参与者使用,后台缓冲区由另一个参与者修改。 当发生交换时,前后缓冲区更改位置。
-
drawable object
- 在OpenGL ES之外分配的对象,可用作OpenGL ES framebuffer对象的一部分。 在iOS上,唯一可绘制对象的类型是将OpenGL ES渲染集成到Core Animation中的
CAEAGLLayer
类。
- 在OpenGL ES之外分配的对象,可用作OpenGL ES framebuffer对象的一部分。 在iOS上,唯一可绘制对象的类型是将OpenGL ES渲染集成到Core Animation中的
-
extension
- OpenGL ES的一个功能,它不是OpenGL ES核心API的一部分,因此不能保证每个OpenGL ES的实现得到支持。 用于扩展名的命名约定表示扩展名被广泛接受。 仅由特定公司支持的扩展名称包括公司名称的缩写。 如果多于一家公司采用扩展,扩展名称将更改为包括EXT,而不是公司缩写。 如果
Khronos OpenGL
工作组批准了扩展名,则扩展名称将更改为包括OES
,而不是EXT
或公司缩写。
- OpenGL ES的一个功能,它不是OpenGL ES核心API的一部分,因此不能保证每个OpenGL ES的实现得到支持。 用于扩展名的命名约定表示扩展名被广泛接受。 仅由特定公司支持的扩展名称包括公司名称的缩写。 如果多于一家公司采用扩展,扩展名称将更改为包括EXT,而不是公司缩写。 如果
-
eye coordinates
- 坐标系与观察者在原点。 眼坐标由模型视图矩阵生成并传递给投影矩阵。
-
filtering
- 通过组合像素或纹素来修改图像的过程。
-
fog
- 通过根据与观察者的距离将颜色褪色为背景颜色而实现的效果。 雾为观察者提供深度线索。
-
fragment
- 光栅化原色时计算的颜色和深度值。 每个片段必须经过一系列测试,才能与存储在帧缓冲区中的像素混合。
-
system framebuffer
- 由操作系统提供的帧缓冲区。 这种类型的帧缓冲区支持将OpenGL ES集成到操作系统的窗口系统中。 iOS不使用系统帧缓冲区。 而是提供与Core Animation层相关联的帧缓冲区对象。
-
framebuffer attachable image
- framebuffer对象的渲染目的地。
-
framebuffer object
- 由OpenGL ES完全管理的帧缓冲区。 帧缓冲区对象包含OpenGL ES帧缓冲区及其图像集的状态信息,称为
renderbuffer
。 FrameBuffers内置在OpenGL ES 2.0及更高版本中,所有的OpenGL ES 1.1的iOS实现都保证支持framebuffer对象(通过OES_framebuffer_object
扩展)。
- 由OpenGL ES完全管理的帧缓冲区。 帧缓冲区对象包含OpenGL ES帧缓冲区及其图像集的状态信息,称为
-
frustum
- 锥体观察者看到的空间区域,由透视分割扭曲。
-
image
- 像素的矩形阵列。
-
interleaved data
- 分组在一起的不同数据的数组,如顶点数据和纹理坐标。 交错可以加快数据检索速度。
-
mipmaps
- 一组纹理贴图,以各种分辨率提供,其目的是最小化纹理,应用于屏幕分辨率与源纹理贴图不匹配的几何图元时可能发生的伪影。
Mipmapping
源于拉夫语中的多义词,意思是“many things in a small place”
。
- 一组纹理贴图,以各种分辨率提供,其目的是最小化纹理,应用于屏幕分辨率与源纹理贴图不匹配的几何图元时可能发生的伪影。
-
modelview matrix
- OpenGL用于将点,线,多边形和位置从对象坐标转换为眼睛坐标的4 x 4矩阵。
-
multisampling
- 一种在像素处采用多个样本并将其与覆盖值组合以获得最终片段的技术。
-
mutex
- 是多线程应用程序中的互斥对象。
-
packing
- 将像素颜色组件从缓冲区转换为应用程序所需的格式。
-
pixel
- 一个像素 - 图形硬件可以在屏幕上显示的最小元素。 像素由帧缓冲器中所有位平面中的位置x,y处的所有位组成。
-
pixel depth
- 在像素图像中,每像素的位数。
-
pixel format
- 用于将像素数据存储在内存中的格式。 该格式描述像素分量(红色,绿色,蓝色,阿尔法),组件的数量和顺序以及其他相关信息,例如像素是否包含模板和深度值。
-
premultiplied alpha
- 其他分量已经乘以α值的像素。 例如,一个像素的RGBA值开始为
(1.0,0.5,0.0,0.5)
,当预先乘时,值为(0.5,0.25,0.0,0.5)
。
- 其他分量已经乘以α值的像素。 例如,一个像素的RGBA值开始为
-
primitives
- OpenGL点,线,多边形,位图和图像中最简单的元素。
-
projection matrix
- OpenGL用于将点,线,多边形和位置从眼睛坐标转换为裁剪坐标的矩阵。
-
rasterization
- 将顶点和像素数据转换为片段的过程,每个片段对应于帧缓冲区中的像素。
-
renderbuffe
- 一个2D像素图像的渲染目的地,正如
OpenGL specification
中定义的OES_framebuffer_object
扩展,用于广义的屏幕外渲染。
- 一个2D像素图像的渲染目的地,正如
-
renderer
- OpenGL ES用于从视图和模型创建图像的硬件和软件的组合。
-
rendering context
- 状态信息的容器。
-
rendering pipeline
- OpenGL ES使用的顺序操作将像素和顶点数据转换为帧缓冲区中的图像。
-
render-to-texture
- 将内容直接绘制到纹理目标的操作。
-
RGBA
- 红色,绿色,蓝色和阿尔法颜色组件。
-
shader
- 计算表面属性的程序。
-
shading language
- 一种高级语言,用于制作高级成像效果。
-
stencil buffer
- 专门用于模板测试存储器。 模板测试通常用于识别掩蔽区域,以识别需要加盖的实心几何图形,并与半透明多边形重叠。
-
tearing
- 在当前帧的一部分在当前帧完全呈现在屏幕上之前覆盖帧缓冲区中的前一帧数据时引起的视觉异常。 iOS通过
Core Animation
处理所有可见的OpenGL ES内容来避免撕裂。
- 在当前帧的一部分在当前帧完全呈现在屏幕上之前覆盖帧缓冲区中的前一帧数据时引起的视觉异常。 iOS通过
-
tessellation
- 将一个表面缩小到一个多边形的网格,或一条曲线到一条线的操作。
-
texel
- 用于指定要应用于片段的颜色的纹理元素。
-
texture
- 用于修改光栅化片段颜色的图像数据。 数据可以是一维,二维或三维,也可以是立方图。
-
texture mapping
- 将纹理应用于原语的过程。
-
texture matrix
- OpenGL ES 1.1用于将纹理坐标转换为用于插值和纹理查找的坐标的4 x 4矩阵。
-
texture object
- 用于存储与纹理相关的所有数据的不透明数据结构。 纹理对象可以包括诸如图像,mipmap和纹理参数(宽度,高度,内部格式,分辨率,包装模式等)。
-
vertex
- 一个三维点。 一组顶点指定形状的几何。 顶点可以具有许多附加属性,如颜色和纹理坐标。 参见vertex array。
-
vertex array
- 存储指定顶点坐标,纹理坐标,曲面法线,RGBA颜色,颜色索引和边缘标记等数据的数据块的数据结构。
-
vertex array object
- 一个记录活动顶点属性列表的OpenGL ES对象,每个属性存储的格式以及描述顶点和属性的数据的位置。 顶点数组对象简化了重新配置图形管道的工作。
后记
未完,待续~~~