blob: d8e71e7fd358b10cb83530bcc63ce375a47d8b21 [file] [log] [blame]
Name
OES_matrix_palette
Name Strings
GL_OES_matrix_palette
Contact
Aaftab Munshi (amunshi@ati.com)
Notice
Copyright (c) 2004-2013 The Khronos Group Inc. Copyright terms at
http://www.khronos.org/registry/speccopyright.html
Specification Update Policy
Khronos-approved extension specifications are updated in response to
issues and bugs prioritized by the Khronos OpenGL Working Group. For
extensions which have been promoted to a core Specification, fixes will
first appear in the latest version of that core Specification, and will
eventually be backported to the extension document. This policy is
described in more detail at
https://www.khronos.org/registry/OpenGL/docs/update_policy.php
Status
Ratified by the Khronos BOP, Aug 5, 2004.
Version
Version 1, August 2004
Number
OpenGL ES Extension #12
Dependencies
OpenGL ES 1.0 is required.
Overview
This extension adds the ability to support vertex skinning in OpenGL ES.
A simplified version of the ARB_matrix_palette extension is used to
define OES_matrix_palette extension.
This extension allow OpenGL ES to support a palette of matrices. The matrix
palette defines a set of matrices that can be used to transform a vertex.
The matrix palette is not part of the model view matrix stack and is enabled
by setting the MATRIX_MODE to MATRIX_PALETTE_OES.
The n vertex units use a palette of m modelview matrices (where n and m are
constrained to implementation defined maxima.) Each vertex has a set of n
indices into the palette, and a corresponding set of n weights.
Matrix indices and weights can be changed for each vertex.
When this extension is utilized, the enabled units transform each
vertex by the modelview matrices specified by the vertices'
respective indices. These results are subsequently scaled by the
weights of the respective units and then summed to create the
eyespace vertex.
A similar procedure is followed for normals. Normals, however,
are transformed by the inverse transpose of the modelview matrix.
IP Status
Unknown, but believed to be none.
Issues
Should this extension be an optional or mandatory extension
Will be an optional extension since ARB_matrix_palette didn't
see much usage in OpenGL.
Should we allow the ability to load the current model view matrix
into the matrix palette
Yes. This will be very helpful since it makes it very easy
to load an object heirarchy. This will also be helpful for JSR184
Should the Matrix palette be loaded with a new LoadMatrixPalette
command?
No, although this provides an easy way to support arbitrary
palette sizes, the method loses the current (MultMatrix,
Rotate, Translate, Scale..) matrix functionality.
Matrices will be Loaded into the palette with current
functions when MATRIX_MODE is MATRIX_PALETTE_OES. The current
palette index is set by an explicit command:
CurrentPaletteMatrixARB().
Should the Matrix Palette have a stack?
Not required, this wastes a lot of space.
Should the matrix palette be gettable?
No.
Should MatrixIndexARB be changed to imply LoadMatrix calls to the
applicable MODELVIEW_MATRIXn stacks?
No, the MODELVIEW_MATRIXn matrices are unused when
MATRIX_PALETTE is enabled.
Should there be a way to specify that the modelview matrices
for two different vertex units are identical?
Not explicitly, but indexing the matrix palette provides this
functionality. (Both units will have the same matrix index.)
New Procedures and Functions
void CurrentPaletteMatrixOES(uint index)
void LoadPaletteFromModelViewMatrixOES()
void MatrixIndexPointerOES(int size, enum type, sizei stride, void *pointer)
void WeightPointerOES(int size, enum type, sizei stride, void *pointer);
New Tokens
Accepted by the <mode> parameter of MatrixMode, and by the
<cap> parameters of Enable and Disable:
MATRIX_PALETTE_OES 0x8840
Accepted by the <pname> parameters of GetIntegerv:
MAX_PALETTE_MATRICES_OES 0x8842
MAX_VERTEX_UNITS_OES 0x86A4
CURRENT_PALETTE_MATRIX_OES 0x8843
The default values for MAX_PALETTE_MATRICES_OES and MAX_VERTEX_UNITS_OES
are 9 and 3 resp.
Accepted by the <cap> parameters of EnableClientState and DisableClientState and
by the <pname> parameter of IsEnabled:
MATRIX_INDEX_ARRAY_OES 0x8844
WEIGHT_ARRAY_OES 0x86AD
Accepted by the <pname> parameter of GetIntegerv:
MATRIX_INDEX_ARRAY_SIZE_OES 0x8846
MATRIX_INDEX_ARRAY_TYPE_OES 0x8847
MATRIX_INDEX_ARRAY_STRIDE_OES 0x8848
MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES 0x8B9E
WEIGHT_ARRAY_SIZE_OES 0x86AB
WEIGHT_ARRAY_TYPE_OES 0x86A9
WEIGHT_ARRAY_STRIDE_OES 0x86AA
WEIGHT_ARRAY_BUFFER_BINDING_OES 0x889E
Accepted by the <pname> parameter of GetPointerv:
MATRIX_INDEX_ARRAY_POINTER_OES 0x8849
WEIGHT_ARRAY_POINTER_OES 0x86AC
Additions to Chapter 2 of the OpenGL ES 1.0 Specification
- Added to section 2.8
void WeightPointerOES(int size, enum type, sizei stride, void *pointer);
void MatrixIndexPointerOES(int size, enum type, sizei stride, void *pointer);
WeightPointerOES & MatrixIndexPointerOES are used to describe the weights and
matrix indices used to blend corresponding matrices for a given vertex.
For implementations supporting matrix palette, note that <size> values for
WeightPointerOES & MatrixIndexPointerOES must be less than or equal to the
implementation defined value MAX_VERTEX_UNITS_OES.
- Added to table in section 2.8
Command Sizes Types
------- ----- -----
WeightPointerOES 1..MAX_VERTEX_UNITS_OES fixed, float
MatrixIndexPointerOES 1..MAX_VERTEX_UNITS_OES ubyte
- (section 2.8) Extend the cap flags passed to EnableClientState/DisableClientState
to include
MATRIX_INDEX_ARRAY_OES, or WEIGHT_ARRAY_OES
- (section 2.10) Add the following:
"The vertex coordinates that are presented to the GL are termed
object coordinates. The model-view matrix is applied to these
coordinates to yield eye coordinates. In implementations with
matrix palette, the matrices specified by the indices per vertex
are applied to these coordinates and the weighted sum of the
results are the eye coordinates. Then another matrix, called the
projection matrix, is applied to eye coordinates to yield clip
coordinates. A perspective division is carried out on clip
coordinates to yield normalized device coordinates.
A final viewport transformation is applied to convert these
coordinates into window coordinates."
"... the vertex's eye coordinates are found as:
(xe) n-1 (xo)
(ye) = SUM w_i * M_i * (yo)
(ze) i=0 (zo)
(we) (wo)
where M_i is the palette matrix associated with the i'th
Vertex unit:
M_i = MatrixPalette[MatrixIndex[i]],
if MATRIX_PALETTE_OES is enabled, and
M_i = MODELVIEW_MATRIX, otherwise.
w_i is the Vertex's associated weight for vertex unit i:
w_i = weight_i, if MATRIX_PALETTE_OES is enabled,
1, if MATRIX_PALETTE_OES is disabled,
and,
n = <size> value passed into glMatrixIndexPointerOES."
"The projection matrix and model-view matrices are set
with a variety of commands. The affected matrix is
determined by the current matrix mode. The current
matrix mode is set with
void MatrixMode( enum mode );
which takes one of the pre-defined constants TEXTURE,
MODELVIEW, PROJECTION, MATRIX_PALETTE_OES.
In implementations supporting OES_matrix_palette,
void CurrentPaletteMatrixOES(uint index);
defines which of the palette's matrices is affected by
subsequent matrix operations when the current matrix mode is
MATRIX_PALETTE_OES. CurrentPaletteMatrixOES generates the
error INVALID_VALUE if the <index> parameter is not between
0 and MAX_PALETTE_MATRICES_OES - 1.
In implementations supporting OES_matrix_palette,
void LoadPaletteFromModelViewMatrixOES();
copies the current model view matrix to a matrix in the matrix
palette, specified by CurrentPaletteMatrixOES.
DrawArrays and DrawElements will not render the primitive if
the matrix palette was enabled and the weights and/or matrix
index vertex pointers are disabled or are not valid.
"The state required to implement transformations consists of a
four-valued integer indicating the current matrix mode, a
stack of at least two 4 x 4 matrices for each of PROJECTION,
and TEXTURE with associated stack pointers, a stack of at least
32 4 x 4 matrices with an associated stack pointer for MODELVIEW,
and a set of MAX_PALETTE_MATRICES_OES matrices of at least 9
4 x 4 matrices each for the matrix palette.
Initially, there is only one matrix on each stack, and all
matrices are set to the identity. The initial matrix mode
is MODELVIEW.
"When matrix palette is enabled, the normal is transformed
to eye space by:
n-1
(nx' ny' nz') = (nx ny nz) Inv ( SUM w_i * Mu_i)
i=0
Alternatively implementations may choose to transform the
normal to eye-space by:
n-1
(nx' ny' nz') = SUM w_i * (nx ny nz) Inv(Mu_i)
i=0
where Mu_i is the upper leftmost 3x3 matrix taken from the
modelview for vertex unit i (M_i),
M_i = MatrixPalette[MatrixIndex[i]],
if MATRIX_PALETTE_OES is enabled, and
M_i = MODELVIEW_MATRIX, otherwise
otherwise.
weight_i is the vertex's associated weight for vertex unit i,
w_i = weight_i
and
n = <size> value passed into glMatrixIndexPointerOES."
Errors
INVALID_VALUE is generated if the <size> parameter for
MatrixIndexPointerOES or WeightPointerOES is greater
than MAX_VERTEX_UNITS_OES.
INVALID_VALUE is generated if the <count> parameter to
CurrentPaletteMatrixOES is greater than MAX_PALETTE_MATRICES_OES - 1
New State
(table 6.6, p. 232)
Get Initial
Get Value Type Command Value Description
--------- ---- ------- ------- -----------
MATRIX_INDEX_ARRAY_OES B IsEnabled False matrix index array enable
MATRIX_INDEX_ARRAY_SIZE_OES Z+ GetIntegerv 0 matrix indices per vertex
MATRIX_INDEX_ARRAY_TYPE_OES Z+ GetIntegerv UBYTE type of matrix index data
MATRIX_INDEX_ARRAY_STRIDE_OES Z+ GetIntegerv 0 stride between
matrix indices
MATRIX_INDEX_ARRAY_POINTER_OES Y GetPointerv 0 pointer to matrix
index array
WEIGHT_ARRAY_OES B IsEnabled False weight array enable
WEIGHT_ARRAY_SIZE_OES Z+ GetIntegerv 0 weights per vertex
WEIGHT_ARRAY_TYPE_OES Z2 GetIntegerv FLOAT type of weight data
WEIGHT_ARRAY_STRIDE_OES Z+ GetIntegerv 0 stride between weights
per vertex
WEIGHT_ARRAY_POINTER_OES Y GetPointerv 0 pointer to weight array
(table 6.7, p. 233)
Get Initial
Get Value Type Command Value Description
--------- ---- ------- ----- -----------
MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES Z+ GetIntegerv 0 matrix index array
buffer binding
WEIGHT_ARRAY_BUFFER_BINDING_OES Z+ GetIntegerv 0 weight array
buffer binding
(table 6.9, p. 235)
Get Initial
Get Value Type Command Value Description
--------- ---- ------- ------- -----------
MATRIX_PALETTE_OES B IsEnabled False matrix palette enable
MAX_PALETTE_MATRICES_OES Z+ GetIntegerv 9 size of matrix palette
MAX_VERTEX_UNITS_OES Z+ GetIntegerv 3 number of matrices per vertex
CURRENT_PALETTE_MATRIX_OES Z+ GetIntegerv 0 transform index of current
modelview matrix in the palette,
as set by CurrentPaletteMatrixOES()
Revision History
Addendum: Using this extension.
/* position viewer */
glMatrixMode(GL_MATRIX_PALETTE_OES);
glCurrentPaletteMatrixOES(0);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -7.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glCurrentPaletteMatrixOES(1);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -7.0f);
glRotatef(yrot, 0.0f, 1.0f, 0.0f);
glRotatef(zrot, 0.0f, 0.0f, 1.0f);
glEnable(GL_MATRIX_PALETTE_OES);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_MATRIX_INDEX_ARRAY_OES);
glEnableClientState(GL_WEIGHT_ARRAY_OES);
glVertexPointer(3, GL_FLOAT, 7 * sizeof(GLfloat), vertexdata);
glTexCoordPointer(2, GL_FLOAT, 7 * sizeof(GLfloat), vertexdata + 3);
glWeightPointerOES(2, GL_FLOAT, 7 * sizeof(GLfloat),vertexdata + 5);
glMatrixIndexPointerOES(2, GL_UNSIGNED_BYTE, 0, matrixindexdata);
for(int i = 0; i < (numSegments << 2) + 2; i ++)
glDrawArrays(GL_TRIANGLE_FAN, i << 2, 4);