| Name |
| |
| OES_vertex_array_object |
| |
| Name Strings |
| |
| GL_OES_vertex_array_object |
| |
| Contributors |
| |
| Ben Bowman |
| Yuan Wang |
| Benj Lipchak |
| |
| Contact |
| |
| Ben Bowman, Imagination Technologies (benji 'dot' bowman 'at' imgtec 'dot' com) |
| |
| Notice |
| |
| Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| IP Status |
| |
| |
| Status |
| |
| Complete. Approved by the OpenGL ES WG on November 11, 2009. |
| Approved by the Khronos Board of Promoters on January 29, 2010. |
| |
| Version |
| |
| Version 16, April 17, 2014 |
| |
| Number |
| |
| OpenGL ES Extension #71 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL ES Common 1.1.12 |
| Specification (April 24, 2008) and the OpenGL ES 2.0.24 |
| Specification (April 22, 2009). |
| |
| OES_matrix_palette affects the definition of this extension. |
| |
| Overview |
| |
| This extension introduces vertex array objects which encapsulate |
| vertex array states on the server side (vertex buffer objects). |
| These objects aim to keep pointers to vertex data and to provide |
| names for different sets of vertex data. Therefore applications are |
| allowed to rapidly switch between different sets of vertex array |
| state, and to easily return to the default vertex array state. |
| |
| Issues |
| |
| * Should vertex array objects be sharable across multiple OpenGL ES |
| contexts? |
| |
| RESOLVED: No. The OpenGL ES working group took a straw poll and agreed |
| that the advantages of compatibility with OpenGL and ease of |
| implementation were more important than the disadvantage of creating |
| the first non-shared named object in OpenGL ES. |
| |
| * Is it required for a vertex array object name to be explicitly |
| generated before being bound? |
| |
| RESOLVED: Yes. The OpenGL ES working group agreed that |
| compatibility with OpenGL and the ability to to guide developers to |
| more "future looking" object usage were more important than keeping |
| consistency with other objects in OpenGL ES 1 and 2. |
| |
| * Should a vertex array object be allowed to encapsulate client |
| vertex arrays? |
| |
| RESOLVED: No. The OpenGL ES working group agreed that compatibility |
| with OpenGL and the ability to to guide developers to more |
| performant drawing by enforcing VBO usage were more important than |
| the possibility of hurting adoption of VAOs. |
| |
| * Should client array indices be employed by DrawElements when a |
| non-zero vertex array object is bound? |
| |
| RESOLVED: Yes. The original ARB_vao and OpenGL 3.0 incarnations of |
| this feature allowed client index data, so this extension should |
| also. |
| |
| * When an application attempts to utilise a zero-named vertex array |
| buffer or a zero-named element array buffer, while a non-zero |
| vertex array object is presently attached, what should happen? |
| |
| RESOLVED: Generally speaking, these kinds of endeavours are |
| erroneous, but some cases are deliberately tolerated. And they are |
| detailed as follows: |
| |
| - Binding a zero-named vertex array buffer: |
| this can be detected by *Pointer(ES1) or VertexAttribPointer(ES2); |
| |
| - if the pointer argument is not NULL: |
| this means to bind a client vertex array; |
| an INVALID_OPERATION error will be returned. |
| |
| - if the pointer argument is NULL: |
| the result or drawing will be undefined, but with no GL error; |
| this enables a previously encapsulated vertex array buffer to |
| be detached from a vertex array object. |
| |
| - Binding a zero-named element array buffer: |
| this can be identified by DrawElements; |
| |
| - no restrictions. |
| |
| |
| New Procedures and Functions |
| |
| void BindVertexArrayOES(uint array); |
| |
| void DeleteVertexArraysOES(sizei n, const uint *arrays); |
| |
| void GenVertexArraysOES(sizei n, uint *arrays); |
| |
| boolean IsVertexArrayOES(uint array); |
| |
| New Tokens |
| |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv: |
| |
| VERTEX_ARRAY_BINDING_OES 0x85B5 |
| |
| Additions to Chapter 2 (OpenGL ES Operation) |
| |
| * Add a new Section "2.X Vertex Array Objects" after Section "2.9 |
| Buffer Objects". |
| |
| The buffer objects that are to be used by the vertex stage of the |
| GL ES are collected together to form a vertex array object. All |
| state related to the definition of the data used by the vertex |
| processor is encapsulated in a vertex array object. |
| |
| The command |
| |
| void GenVertexArraysOES(sizei n, uint *arrays); |
| |
| returns <n> previous unused vertex array object names in <arrays>. |
| These names are marked as used, for the purposes of |
| GenVertexArraysOES only, but they acquire array state only when |
| they are first bound, just as if they were unused. |
| |
| Vertex array objects are deleted by calling |
| |
| void DeleteVertexArraysOES(sizei n, const uint *arrays); |
| |
| <arrays> contains <n> names of vertex array objects to be deleted. |
| Once a vertex array object is deleted it has no contents and its |
| name becomes unused again. If a vertex array object that is |
| currently bound is deleted, the binding for that object reverts to |
| zero and the default vertex array becomes current. Unused names in |
| <arrays> are silently ignored, as if they have the value zero. |
| |
| The name space for vertex array objects is the unsigned integers, |
| with zero reserved for the GL ES. |
| |
| A vertex array object is created by binding an unused name with the |
| command |
| |
| void BindVertexArrayOES(uint array); |
| |
| IF(ES1) |
| |
| and <array> here is the vertex array object name. The resulting |
| vertex array object is a new state vector, comprising all the state |
| values (listed in Tables 6.4 & 6.5, except CLIENT_ACTIVE_TEXTURE |
| and ARRAY_BUFFER_BINDING): |
| |
| VERTEX_ARRAY, |
| VERTEX_ARRAY_SIZE, |
| VERTEX_ARRAY_TYPE, |
| VERTEX_ARRAY_STRIDE, |
| VERTEX_ARRAY_POINTER, |
| VERTEX_ARRAY_BUFFER_BINDING, |
| |
| NORMAL_ARRAY, |
| NORMAL_ARRAY_TYPE, |
| NORMAL_ARRAY_STRIDE, |
| NORMAL_ARRAY_POINTER, |
| NORMAL_ARRAY_BUFFER_BINDING, |
| |
| COLOR_ARRAY, |
| COLOR_ARRAY_SIZE, |
| COLOR_ARRAY_TYPE, |
| COLOR_ARRAY_STRIDE, |
| COLOR_ARRAY_POINTER, |
| COLOR_ARRAY_BUFFER_BINDING, |
| |
| TEXTURE_COORD_ARRAY, |
| TEXTURE_COORD_ARRAY_SIZE, |
| TEXTURE_COORD_ARRAY_TYPE, |
| TEXTURE_COORD_ARRAY_STRIDE, |
| TEXTURE_COORD_ARRAY_POINTER, |
| TEXTURE_COORD_ARRAY_BUFFER_BINDING, |
| |
| POINT_SIZE_ARRAY_OES, |
| POINT_SIZE_ARRAY_TYPE_OES, |
| POINT_SIZE_ARRAY_STRIDE_OES, |
| POINT_SIZE_ARRAY_POINTER_OES, |
| POINT_SIZE_ARRAY_BUFFER_BINDING_OES, |
| |
| ELEMENT_ARRAY_BUFFER_BINDING. |
| |
| BindVertexArrayOES may also be used to bind an existing vertex |
| array object. If the binding is successful, no change is made to |
| the state of the bound vertex array object, and any previous |
| binding is broken. |
| |
| BindVertexArrayOES fails and an INVALID_OPERATION error is |
| generated if array is not a name returned from a previous call to |
| GenVertexArraysOES, or if such a name has since been deleted with |
| DeleteVertexArraysOES. An INVALID_OPERATION error is generated if |
| any of the *Pointer commands specifying the location and |
| organization of vertex array data are called while a non-zero |
| vertex array object is bound, zero is bound to the ARRAY_BUFFER |
| buffer object binding point, and the pointer argument is not NULL |
| [fn1]. |
| [fn1: This error makes it impossible to create a vertex array |
| object containing client array pointers, while still allowing |
| buffer objects to be unbound.] |
| |
| The currently bound vertex array object is used for all commands |
| that modify vertex array state, such as |
| VertexPointer, |
| NormalPointer, |
| ColorPointer, |
| TexCoordPointer, |
| PointSizePointerOES, |
| EnableClientState, |
| DisableClientState, |
| ClientActiveTexture, |
| all commands that draw from vertex arrays, such as |
| DrawArrays |
| DrawElements, |
| and all queries of vertex array state (see Chapter 6). |
| |
| END(ES1) |
| |
| IF(ES2) |
| |
| and <array> here is the vertex array object name. The resulting |
| vertex array object is a new state vector, comprising all the state |
| values (listed in Table 6.2, except ARRAY_BUFFER_BINDING): |
| |
| VERTEX_ATTRIB_ARRAY_ENABLED, |
| VERTEX_ATTRIB_ARRAY_SIZE, |
| VERTEX_ATTRIB_ARRAY_STRIDE, |
| VERTEX_ATTRIB_ARRAY_TYPE, |
| VERTEX_ATTRIB_ARRAY_NORMALIZED, |
| VERTEX_ATTRIB_ARRAY_POINTER, |
| ELEMENT_ARRAY_BUFFER_BINDING, |
| VERTEX_ATTRIB_ARRAY_BUFFER_BINDING. |
| |
| BindVertexArrayOES may also be used to bind an existing vertex |
| array object. If the binding is successful, no change is made to |
| the state of the bound vertex array object, and any previous |
| binding is broken. |
| |
| BindVertexArrayOES fails and an INVALID_OPERATION error is |
| generated if array is not a name returned from a previous call to |
| GenVertexArraysOES, or if such a name has since been deleted with |
| DeleteVertexArraysOES. An INVALID_OPERATION error is generated if |
| VertexAttribPointer is called while a non-zero vertex array object |
| is bound, zero is bound to the <ARRAY_BUFFER> buffer object binding |
| point and the pointer argument is not NULL [fn1]. |
| [fn1: This error makes it impossible to create a vertex array |
| object containing client array pointers, while still allowing |
| buffer objects to be unbound.] |
| |
| The currently bound vertex array object is used for all commands |
| that modify vertex array state, such as VertexAttribPointer and |
| EnableVertexAttribArray; all commands that draw from vertex arrays, |
| such as DrawArrays and DrawElements; and all queries of vertex |
| array state (see Chapter 6). |
| |
| END(ES2) |
| |
| And the presently attached vertex array object has the following |
| impacts on the draw commands: |
| |
| While a non-zero vertex array object is bound, if any enabled |
| array's buffer binding is zero, when DrawArrays or |
| DrawElements is called, the result is undefined. |
| |
| Additions to Chapter 3 (Rasterization) |
| |
| * None. |
| |
| |
| Additions to Chapter 4 (Per-Fragment Operations and the Framebuffer) |
| |
| * None. |
| |
| |
| Additions to Chapter 5 (Special Functions) |
| |
| * None. |
| |
| |
| Additions to Chapter 6 (State and State Requests) |
| |
| IF(ES1) |
| |
| * Add a new paragraph at the end of Section 6.1.2: Data Conversions |
| (Page 119). |
| |
| Vertex array state variables are qualified by the value of |
| VERTEX_ARRAY_BINDING_OES to determine which vertex array object is |
| queried. Tables 6.4 & 6.5 define the set of state stored in a |
| vertex array object. |
| |
| * Add a new Section "6.1.X Vertex Array Object Queries" after |
| Sections "6.1.6 Buffer Object Queries" (Page 120). |
| |
| The command |
| |
| boolean IsVertexArrayOES(uint array); |
| |
| returns TRUE if <array> is the name of a vertex array object. If |
| <array> is zero, or a non-zero value that is not the name of a |
| vertex array object, IsVertexArrayOES returns FALSE. No error is |
| generated if <array> is not a valid array object name. |
| |
| END(ES1) |
| |
| IF(ES2) |
| |
| * Add a new paragraph at the end of Section 6.1.2: Data Conversions |
| (Page 123). |
| |
| Vertex array state variables are qualified by the value of |
| VERTEX_ARRAY_BINDING_OES to determine which vertex array object is |
| queried. Table 6.2 defines the set of state stored in a vertex |
| array object. |
| |
| * Add a new Section "6.1.X Vertex Array Object Queries" between |
| Sections "6.1.6 Buffer Object Queries" and "6.1.7 Framebuffer |
| Object and Renderbuffer Queries" (Page 126). |
| |
| The command |
| |
| boolean IsVertexArrayOES(uint array); |
| |
| returns TRUE if <array> is the name of a vertex array object. If |
| <array> is zero, or a non-zero value that is not the name of a |
| vertex array object, IsVertexArray returns FALSE. No error is |
| generated if <array> is not a valid array object name. |
| |
| * Modify lines in Section 6.1.8: Shader and Program Queries |
| |
| Page 131: replace "Note that all the queries except |
| CURRENT_VERTEX_ATTRIB return client state." |
| with |
| "Note that all the queries except CURRENT_VERTEX_ATTRIB return |
| values stored in the currently bound vertex array object (the value |
| of VERTEX_ARRAY_BINDING). If the zero object is bound, then the |
| queries return client state." |
| |
| Page 131: add lines after "<pname> must be VERTEX_ATTRIB_ARRAY_POINTER." |
| The value returned is queried from the currently bound vertex array |
| object. If the zero object is bound, the value is queried from |
| client state. |
| |
| |
| Additions to Appendix C (Deleting Shared Objects) |
| |
| * Add another section in C.2 Sharing objects across multiple OpenGL |
| ES contexts (Page 163). |
| |
| Objects which cannot be shared in this manner include: |
| vertex array objects |
| |
| END(ES2) |
| |
| IF(ES1) |
| |
| Dependencies on OES_matrix_palette |
| |
| If OES_matrix_palette is supported, the language below should be |
| added into Chapter 2. |
| |
| The vertex array object can also comprise the following state values: |
| MATRIX_INDEX_ARRAY_OES, |
| MATRIX_INDEX_ARRAY_SIZE_OES, |
| MATRIX_INDEX_ARRAY_TYPE_OES, |
| MATRIX_INDEX_ARRAY_STRIDE_OES, |
| MATRIX_INDEX_ARRAY_POINTER_OES, |
| MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES, |
| |
| WEIGHT_ARRAY_OES, |
| WEIGHT_ARRAY_SIZE_OES, |
| WEIGHT_ARRAY_TYPE_OES, |
| WEIGHT_ARRAY_STRIDE_OES, |
| WEIGHT_ARRAY_POINTER_OES, |
| WEIGHT_ARRAY_BUFFER_BINDING_OES. |
| |
| And the currently bound vertex array object can also be used for the |
| following commands |
| WeightPointerOES, |
| MatrixIndexPointerOES. |
| |
| END(ES1) |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ------- ---------- ------------ ----------------------------------------------------- |
| 16 04/17/14 Jon Leech Update wording of first issue (Bug 7847). |
| 15 02/05/10 Jon Leech Update Status and assign extension number. |
| Reflow spec text to standard widths. |
| 14 10/11/09 Ben Bowman Allow VAO to employ client indices. |
| 13 09/11/09 Yuan Wang Forbade VAO to employ client array indices. |
| 12 04/11/09 Ben Bowman Updated EXT to OES and adopted resolutions of the |
| OpenGL ES working group meeting on 04/11/09. (re) |
| disallow user generated (non Gen'd) names. |
| 11 23/10/09 Ben Bowman Fixed INVALID_OPERATION error for client arrays. |
| 10 14/10/09 Ben Bowman Adopted resolutions of the OpenGL ES working group |
| meeting on 14/10/09. (re) disallow client arrays to |
| be included in VAOs. Disallow sharing of VAOs. |
| 9 14/10/09 Yuan Wang Added dependencies on OES_matrix_palette |
| 8 14/10/09 Ben Bowman Formatting. Reopen of shared object decision. |
| 7 09/09/09 Ben Bowman Cleanup of issues list. |
| 6 04/09/09 Yuan Wang Changed contact details and added contributors. |
| Replaced IMG with EXT, added the extension for ES1 |
| specification and added revision history. |
| 5 20/08/09 Yuan Wang Allowed VAO to encapsulate client attribute arrays. |
| 4 16/07/09 Yuan Wang Added ELEMENT_ARRAY_BUFFER_BINDING into VAO's |
| contained states, but took ARRAY_BUFFER_BINDING |
| out of the states. |
| 3 07/07/09 Yuan Wang Removed VERTEX_ARRAY_IMG token, and removed target |
| param from BindVertexArrayIMG, since there is only |
| one type of target for VAO. |
| 2 26/06/09 Yuan Wang Added IMG affix and VERTEX_ARRAY target for |
| BindVertexArrayIMG. |
| 1 15/06/09 Yuan Wang Initial revision. |
| |
| |
| |
| |