logo资料库

OpenGL ES 2.0规范(中文版)——本人自己翻译总结的.pdf

第1页 / 共55页
第2页 / 共55页
第3页 / 共55页
第4页 / 共55页
第5页 / 共55页
第6页 / 共55页
第7页 / 共55页
第8页 / 共55页
资料共55页,剩余部分请下载后查看
OpenGL ES 2.0 Common Profile 规范规范规范规范 作者作者作者作者::::杨延杨延杨延杨延 EMAIL::::yangyanhao12@yahoo.com.cn 申明申明申明申明 本规范是本人根据《OpenGL ES Profile Specification 2.0.24 (Difference Specification) (April 1, 2009) (Annotated)》进行学习时翻译的,我今天把它提取出来,仅供大家学习使用, 帮助想学习 OpenGL ES 2.0 这一国内中文资料尚少的 OpenGL 嵌入式 API,我是从 2010 年 8 月 17 号左右正开始接触 OpenGL ES 2.0,当时根本都不懂什么叫 OpenGL ES 2.0,更别说用 它来做嵌入式设备上的三维图像开发了。我当时连 OpenGL 都不太懂,只知道有这个 3D 的 API。我先花了不到五天的时间,在不懂 OpenGL 和 OpenGL ES 的情况下,将这篇规范翻译 成中文,因此,文中会有很多翻译不对的,而且文中后面有些表格实在不想手画,直接是从 英文的规范中截图的,如有给大家理解上带来的不便,敬请原谅小女子的初生牛犊!本文档 只供学习使用,任何其它商业用途,将都属于不尊重作者的行为! 本人现在还在学习和研究 OpenGL ES 2.0,以及 GLSL 进行 3D 渲染,目前在做 3D 渲 染引擎,因为目前还有许多不懂之处,如果您是这方面的专家,请联系本人! 第一章第一章第一章第一章 概述概述概述概述 OpenGL ES 2.0 只定义了 common profile。定点数据类型(16.16 描述)只由 顶点属性数组支持。着色变量(shader uniform variables)和命令(函数)参数不 再支持定点数,目的是为了简化 API,还有一个原因是定点数据类型的变量没有 任何额外的性能优势。OpenGL ES 2.0 规范和 OpenGL 规范中管线描述一致。规 范中列出了支持的命令和状态,这些命令和状态是 OpenGL 规范中的一部分,但 在 OpenGL ES 2.0 规范中全部描述了这些命令和状态。这篇规范并不只是一篇描 述渲染管线子集和 API 的文档,它还提供了 OpenGL 渲染器(renderer)和 OpenGL ES 渲染之间的差异。 从版本 2.0.22 开始,OpenGL ES 通用配置文件规范是以 OpenGL 2.0 规范为 基础,是一个快速参考手册,提供了与 Open GL 2.0 直接的比较。 1.1 规定规定规定规定 这篇文档描述命令的方式是完全和 OpenGL 2.0 规范中的顺序一致。每一节 对应于完整 OpenGL 规范的相应部分,描述了每个命令配置。在需要的地方, OpenGL ES 2.0 规范对删除的命令给出了一定的说明。 规范中每节包含了保留的命令和参数表。表格中使用了几种符号来显示特殊 情况。符号+表示一个 enumerant 是可选的,或者可能不被 OpenGL 2.0 支持。上
标(+)表示支持该命令,并在表体中有额外的限制。 第二章第二章第二章第二章 OpenGL 操作操作操作操作 OpenGL ES 2.0 规范重大的改变就是不支持 OpenGL 定点函数转换和片段管 线。命令不能以列表形式累积起来留待后续处理,取消了管线第一步的曲线和表 面几何逼近。  OpenGL ES 2.0 是继承自广泛使用的 OpenGL 应用编程接口的一部分。因此,它享 有类似的管线处理、命令结构、相同的 OpenGL 名字空间。有必要时,引入了一 些扩展用于选择性地支持 OpenGL 2.0 功能或充实现有的 OpenGL 2.0 功能。 2.1 OpenGL 基本知识 基本知识 基本知识基本知识 gl 和 GL_仍是命令和语法的前缀。只要在能不需要用命令变量和能降低管 线处理复杂度的地方,就尽可能地减少对不同数据类型(8 位,16 位,32 位, 64 位;整数和浮点数)的支持。完全取消了双精度浮点参数及数据类型,而其 它的命令和数据类型变量根据命令在适当的时候也删除了。在适当的情况下,加 入了定点数据类型(fixed point)。 OpenGL ES 提 供 了 两 个 帧 缓 存 用 于 交 互 : 窗 口 系 统 提 供 的 帧 缓 存 ( window-system-provided framebuffers ) 和 应 用 程 序 创 建 的 帧 缓 存 (application-created framebuffers)。窗口系统提供的帧缓存是一直存在的,而应 用程序创建的帧缓存可根据需要来创建。主要是通过配置接口和管理状态来区分 这两种类型的帧缓存。 OpenGL ES 命令对 window-system-provided framebuffers 所产生的影响,最 终都是由分配帧缓存资源的窗口系统(window-system)来控制。窗口系统决定 OpenGL ES 在任何特定时间内所能访问的部分缓存,以及构造缓存与 OpenGL ES 之间的通信。因此,没有 OpenGL ES 命令来配置窗口系统提供的帧缓存。同样, CRT 监视器或 LCD 面板都不能被 OpenGL ES 访问。结合窗口系统的帧缓存配置 发生在 OpenGL ES 之外。 2.1.1 定点计算 OpenGL ES 2.0 规范支持定点顶点属性,使用 32 位的补码。32 比特位按照 16.16 划分,16 表示分数,16 表示整数位。如果一个顶点使用 16.16 表示,模型 视图和映射矩阵用 16.16 表示,视野空间和规格化设备坐标空间的点用 16.16 表 示(计算过程中的表达式可以使用充足的动态范围),然后变换管线必须计算视 野空间和规格化设备坐标空间的点是有理由的精确(例如:溢出是不被接受的)。 OpenGL ES 2.0 管线要求和在规范 2.1.1 节中指定相同范围和精度。
2.2 GL 状态状态状态状态 OpenGL ES 2.0 规范中保留了完整 OpenGL 规范中描述客户端和服务器状态 的一个子集。依然存在分离的客户端和和服务器状态。6.2 节中概述了规范中所 有状态变量的配置。 2.3 GL 命令语法 命令语法 命令语法命令语法 保留了 OpenGL 命令和和类型的命名约定。增加了定点类型。不支持使用 byte, ubyte, short, ushort 类型作为后缀的命令。删除了所有 double 类型和双精度 (double-precision)命令。OpenGL ES 2.0 规范只使用’f’和’i’作为后缀。 2.4 基本基本基本基本 GL 操作操作操作操作 保留的基本命令操作和 OpenGL 2.0 相同。和 OpenGL 2.0 管线的主要差别是: 命令不能放置在一个显示列表中;没有多项式求值函数;不支持定点函数转换和 片段管线;以及片段块不能直接发送至个人的片段操作中。 2.5 GL 错误错误错误错误 保留了完整的 OpenGL 错误检测行为,包括忽视违法命令和设置当前错误状 态 。 在 所 有 命 令 中 , 参 数 值 不 能 为 未 识 别 的 参 数 值 和 错 误 结 果 ( 如 INVALID_ENUM 或 INVALID_VALUE)。表 2.1 中列出了这些错误。 OpenGL 2.0 NO_EEROR INVALID_ENUM INVALID_VALUE IVALID_OPERATION STACK_OVERFLOW STACK_UNDERFLOW OUT_OF_MEMORY TABLE_TOO_LARGE OpenGL 2.0 enum GetError(void) Common √ √ √ √ — — √ — 表 2.1 错误配置 Common √ 保留了命令 GetError 用于返回当前错误状态。在 OpenGL 2.0 中,可能需要 多次调用 GetError 来获取管线中各部分的错误状态。  良好定义的错误行为允许编写可移植的应用程序。获取错误状态帮助开发人员调 试开发过程中无效的命令参数。这是初始部署的重要特征。
2.6 Begin/End 范式范式范式范式 OpenGL ES 2.0 使用顶点数组绘制几何对象。OpenGL ES 2.0 只支持用户定 义的顶点属性。不支持顶点坐标,标准化(normals),颜色,纹理坐标,因为这 些都可以在顶点属性数组中定义。 自定义顶点属性中的辅助值可使用 2.7 节中描述的属性规范命令进行设置。 因为不支持 Begin 和 End,所以也没有内部状态指示 begin/end 状态。 支持的模式:POINTS, LINES, LINE_STRIP, LINE_LOOP, TRIANGLES, TRIANGLE_STIP, TRIANGLE_FAN;不支持的模式:QUADS, QUAD_STRIP, POLYGON 不支持索引颜色渲染(color index rendering),不支持边界标志(Edge flags)。 OpenGL 2.0 void Begin(enum mode) void End(void) void EdgeFlag[v](T flag) Common — — —  Begin/End 范式提供方便的同时,也导致了大量命令的执行。正确的执行涉及到在 Begin 和 End 之间不能合法执行这些命令。跟踪这些状态产生了额外的负担。然而, 顶点数组能够更有效的执行,因为它们是在单个函数调用中呈现出所有原始数据。 ES 不支持边界标志,因为它们只是在绘制多边形时使用,而 ES 规范中没有 PolygonMode。  删除了 Quads 和 polygons,因为通过三角形可以很容易的模拟实现,这样就免去 了将四边形和多边形分解为三角形的困难,因为它是完全留给应用程序去实现。 删除四边形和多边形也移除了在 line mode 下绘制时需要的边界标志。 2.7 顶点规格 顶点规格 顶点规格顶点规格 OpenGL ES 2.0 没有 Begin 和 End 的概念,顶点是由专门由顶点数组来指定 的。 设置通用顶点属性 0 不再指一个顶点。设置任何通用顶点属性(包括属性 0) 都意味着更新属性的值。状态要求支持由 MAX_VERTEX_ATTRIBS 组成的四分 量浮点数组来存储通用顶点属性。 因为没有当前顶点的概念,所以没有描述顶点坐标的状态。所有通用顶点属 性的初值值,包括顶点属性 0,都是(0,0,0,1)。 OpenGL 2.0 void Normal3{bsifd}[v](T coords) void Vertex{234}{sifd}[v](T coords) Common — — — void TexCoord{1234}{sifd}[v](T coords) void MultiTexCoord{1234}{sifd}[v](enum texture, T coords) —
void Color{3,4}{bsifd ub us ui}[v](T components) void FogCoord{fd}[v](T coord) void SecondaryColor3{bsifd ub us ui}[v](T components) void Index{sifd ub}[v](T components) void VertexAttrib{1234}f[v](uint indx, T values) void VertexAttrib{1234}{sd}[v](uint indx, T values) void VertexAttrib4{bsid ubusui}v(uint indx, T values) void VertexAttrib4N{bsi ubusui}[v](uint indx, T values) — — — — √ — — —  通用顶点属性中每个原始属性可用 VertexAttrib*来设置入口点。保留了常用的浮点 版本的命令,方便以后的扩展或修改。因为这些命令并不经常使用,所以它们只 能用于设置(整体)每个原始属性。  OpenGL ES 2.0 只支持 RGBA 渲染模型。RGBA 的一个或更多元素深度可能是 0. 不支持颜色索引渲染。 2.8 顶点数组 顶点数组 顶点数组顶点数组 VertexAttribPointer 指定顶点数据。不支持先前定义的顶点数据数组,如顶 点坐标数组、颜色坐标数组、标准化坐标数组、纹理坐标数组。不支持颜色索引 和边界值。支持索引和非索引数组,但不支持 InterleaveArrays 和 ArrayElement 命令。 支持 ubyte 和 ushort 指数的索引。OpenGL ES 2.0 没有要求支持 uint 指数。 如果需要实现对 uint 指数,需要导入 OES_element_index_uint 扩展。 OpenGL 2.0 Common void NormalPointer (enum type, sizei stride, const void *ptr) void ColorPointer(int size, enum type, sizei stride, const void *ptr) void TexCoordPointer(int size, enum type, sizei stride, const void *ptr) void SecondaryColorPointer(int size, enum type, sizei stride, void *ptr) void FogCoordPointer(enum type, sizei stride, void *ptr) void EdgeFlagPointer(sizei stride, const void *ptr) void IndexPointer(enum type, sizei stride, const void *ptr) void ArrayElement(int i) void VertexAttribPointer(uint index, int size, enum type, Boolean normalized, sizei stride, const void *ptr) size = 1, 2, 3, 4, type = BYTE size = 1, 2, 3, 4, type = UNSIGNED_BYTE size = 1, 2, 3, 4, type = SHORT size = 1, 2, 3, 4, type = UNSIGNED_SHORT — — — — — — — — √ √ √ √
size = 1, 2, 3, 4, type = INT size = 1, 2, 3, 4, type = UNSIGNED_INT size = 1, 2, 3, 4, type = FLOAT size = 1, 2, 3, 4, type = FIXED void DrawArrays(enum mode, int first, sizei count) mode = POINTS, LINES, LINE_STRIP, LINE_LOOP mode = TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN mode = QUADS, QUAD_STRIP, POLYGON void DrawElements(enum mode, sizei count, enum type, const void *indices) mode = POINTS, LINES, LINE_STRIP, LINE_LOOP mode = TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN mode = QUADS, QUAD_STRIP, POLYGON type = UNSIGNED_BYTE, UNSIGNED_SHORT type = UNSIGNED_INT void MultiDrawArrays(enum mode, int *first, sizei *count, sizei primcount) — — √ √ √ √ — √ √ — √ — — void MultiDrawElements(enum mode, sizei *count, enum type, void — **indices, sizei primcount) void InterleavedArrays(enum format, sizei stride, const void *pointer) void DrawRangeElements(enum mode, uint start, uint end, sizei count, enum type, const void *indices) void ClientActiveTexture(enum texture) void EnableClientState(enum cap) void DisableClientState(enum cap) void EnableVertexAttribArray(uint index) void DisableVertexAttribArray(uint index) — — — — — √ √  支持 float 类型用于全方位的使用,支持的 short, ushort, byte, ubtye 类型用于空间 效率上。对索引顶点数组的支持允许多面坐标数据的重用,也就是说,共享边缘 平滑。  OpenGL 2.0 规范定义的顶点属性数组初始类型为 float。 2.9 缓存对象 缓存对象((((Buffer Objects)))) 缓存对象缓存对象 2.8 节中描述的顶点数据都是存储在客户端的内存中。而有时候想保存使用
频繁的客户端数据(例如顶点数组数据)的位置是高性能的服务器内存。OpenGL ES 缓存对象提供了一套机制,使客户端可以分配,初始化和渲染服务器端内存。 缓存对象被用于存放顶点数组和元素索引数据。 OpenGL 2.0 void BindBuffer(enum target, uint buffer) void DeleteBuffers(sizei n, const uint *buffers) void GenBuffers(sizei n, uint *buffers) Common √ √ √ void BufferData(enum target, sizeiptr size, const void *data, enum usage) √ void BufferSubData(enum target, intptr offset, sizei ptrsize, const void *data) void *MapBuffer(enum target, enum access) boolean UnmapBuffer(enum target) √ — — Name Type Initial Value Legal Values BUFFER_SIZE integer 0 any non-negative integer BUFFER_USAGE enum STATIC_DRAW STATIC_DRAW, DYNAMIC_DRAW, STREAM_DRAW 表 2.2 缓存对象参数和它们的值  不需要 MapBuffer 和 UnmapBuffer 函数,因为它们使得应用程序无法从服务器内 存的顶点缓冲(vertex buffers)中读取指向顶点数据的指针。  BufferData 和 BufferSubData 定义两种新类型(能在 64-bit 系统上正常工作,类似 于 C 语言中的“intptr_t”)。当值的大小可能大于 20 亿时,应该使用新类型“GLintptr” 来替代 GLint。当计数可能超过 20 亿时,应该用新类型“GLsizeiptr”来替代 “GLsizei”。这两种类型都被定义为有符号整型,大到足以包含任何指针的值。因 此,在 64 位系统上它们也自然能容纳更大规模的比特位数或更大的指针。 2.10 矩形矩形矩形矩形 不支持直接定义矩形的命令。 OpenGL 2.0 void Rect{sifd}(T x1, T y1, T x2, T y2) void Rect{sifd}v(T v1[2], T v2[2]) Common — —  不支持矩形命令是因为应用程序需要繁重的开销来绘制矩形。
2.11 坐标转换 坐标转换 坐标转换坐标转换 不再支持固定功能管线改造。应用程序可以计算需要的矩阵(模型视图矩形, 投影矩阵,或任何外观转换矩阵),并在顶点着色器中以整体变量加载它们。在 顶点着色器中将执行计算顶点转换的代码。 支持 Viewport 命令,因为视口转换是发生在可编程顶点转换之后,它是一 个固定函数。 OpenGL 2.0 void LoadIdentity(void) void Rotatef(float angle, float x, float y, float z) void Rotated(double angle, double x, double y, double z) void Viewport(int x, int y, sizei w, sizei h) void MatrixMode (enum mode) void LoadTransposeMatrix{fd}(T m[16]) void MultTransposeMatrix{fd}(T m[16]) void DepthRange(clampd n, clampd f) void DepthRangef(clampf n, clampf f) void MultMatrixf(float m[16]) void MultMatrixd(double m[16]) void LoadMatrixf(float m[16]) void LoadMatrixd(double m[16]) Common — √ √ — — — — — — — — — — — — — — void Translated(double x, double y, double z) void Frustum(double l, double r, double b, double t, double n, double f) — — — — √ — — — — — — — void Ortho(double l, double r, double b, double t, double n, double f) void GetTexGen{ifd}v(enum coord, enum pname, T *params) void PushMatrix(void) void PopMatrix(void) void Frustumf(float l, float r, float b, float t, float n, float f) void Scalef(float x, float y, float z) void Scaled(double x, double y, double z) void Translatef(float x, float y, float z) void Enable/Disable(RESCALE NORMAL) void Enable/Disable(NORMALIZE) void Orthof(float l, float r, float b, float t, float n, float f) void ActiveTexture(enum texture) void TexGen{ifd}[v](enum coord, enum pname, T param) void Enable/Disable(TEXTURE_GEN_{STRQ})  不支持纹理坐标生成,标准化,标准化重新调整等功能,因为它们现在都可以在 顶点着色器(vertex shader)中执行。
分享到:
收藏