Name
ARB_transpose_matrix
Name Strings
GL_ARB_transpose_matrix
Contact
David Blythe (blythe 'at' sgi.com)
Notice
Copyright (c) 1999-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
Complete. Approved by ARB on 12/8/1999
Version
Last Modified Date: January 3, 2000
Author Revision: 1.3
Number
ARB Extension #3
Dependencies
This extensions is written against the OpenGL 1.2 Specification.
May be implemented in any version of OpenGL.
Overview
New functions and tokens are added allowing application matrices
stored in row major order rather than column major order to be
transferred to the OpenGL implementation. This allows an application
to use standard C-language 2-dimensional arrays (m[row][col]) and
have the array indices match the expected matrix row and column indexes.
These arrays are referred to as transpose matrices since they are
the transpose of the standard matrices passed to OpenGL.
This extension adds an interface for transfering data to and from the
OpenGL pipeline, it does not change any OpenGL processing or imply any
changes in state representation.
IP Status
No IP is believed to be involved.
Issues
* Why do this?
It's very useful for layered libraries that desire to use two
dimensional C arrays as matrices. It avoids having the layered
library perform the transpose itself before calling OpenGL since
most OpenGL implementations can efficiently perform the transpose
while reading the matrix from client memory.
* Why not add a mode?
It's substantially more confusing and complicated to add a mode.
Simply adding two new entry points saves considerable confusion
and avoids having layered libraries need to query the current mode
in order to send a matrix with the correct memory layout.
* Why not a utility routine in GLU
It costs some performance. It is believed that most OpenGL
implementations can perform the transpose in place with negligble
performance penalty.
* Why use the name transpose?
It's sure a lot less confusing than trying to ascribe unambiguous
meaning to terms like row and column. It could be matrix_transpose
rather than transpose_matrix though.
* Short Transpose to Trans?
New Procedures and Functions
void LoadTransposeMatrix{fd}ARB(T m[16]);
void MultTransposeMatrix{fd}ARB(T m[16]);
New Tokens
Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv,
and GetDoublev
TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3
TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4
TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5
TRANSPOSE_COLOR_MATRIX_ARB 0x84E6
Additions to Chapter 2 of the 1.2 OpenGL Specification (OpenGL Operation)
Add to Section 2.10.2 Matrices
LoadTransposeMatrixARB takes a 4x4 matrix stored in row-major order as
Let transpose(m,n) be defined as
n[0] = m[0];
n[1] = m[4];
n[2] = m[8];
n[3] = m[12];
n[4] = m[1];
n[5] = m[5];
n[6] = m[9];
n[7] = m[13];
n[8] = m[2];
n[9] = m[6];
n[10] = m[10];
n[11] = m[14];
n[12] = m[3];
n[13] = m[7];
n[14] = m[11];
n[15] = m[15];
The effect of LoadTransposeMatrixARB(m) is then the same as the effect of
the command sequence
float n[16];
transpose(m,n)
LoadMatrix(n);
The effect of MultTransposeMatrixARB(m) is then the same as the effect of
the command sequence
float n[16];
transpose(m,n);
MultMatrix(n);
Additions to Chapter 3 of the 1.2 OpenGL Specification (Rasterization)
None
Additions to Chapter 4 of the 1.2 OpenGL Specification (Per-Fragment Operations
and the Framebuffer)
None
Additions to Chapter 5 of the 1.2 OpenGL Specification (Special Functions)
None
Additions to Chapter 6 of the 1.2 OpenGL Specification (State and State Requests)
Matrices are queried and returned in their transposed form by calling
GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev with set to
TRANSPOSE_MODELVIEW_MATRIX_ARB, TRANSPOSE_PROJECTION_MATRIX_ARB,
TRANSPOSE_TEXTURE_MATRIX_ARB, or TRANSPOSE_COLOR_MATRIX_ARB.
The effect of GetFloatv(TRANSPOSE_MODELVIEW_MATRIX_ARB,m) is then the same
as the effect of the command sequence
float n[16];
GetFloatv(MODELVIEW_MATRIX_ARB,n);
transpose(n,m);
Similar results occur for TRANSPOSE_PROJECTION_MATRIX_ARB,
TRANSPOSE_TEXTURE_MATRIX_ARB, and TRANSPOSE_COLOR_MATRIX_ARB.
Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance)
None
Additions to the GLX Specification
None
GLX Protocol
LoadTransposeMatrix and MultTransposeMatrix are layered
on top of LoadMatrix and MultMatrix protocol
performing client-side translation. The Get commands
are passed over the wire as part of the generic Get
protocol with no translation required.
Errors
No new errors, but error behavoir is inherited by the commands
that the transpose commands are implemented on top of
(LoadMatrix, MultMatrix, and Get*).
New State
None
TRANSPOSE_*_MATRIX_ARB refer to the same state as their non-transposed
counterparts.
New Implementation Dependent State
None
Revision History
* Revision 1.1 - initial draft (18 Mar 1999)
* Revision 1.2 - changed to use layered specification and ARB affix
(23 Nov 1999)
* Revision 1.3 - Minor tweaks to GLX protocol and Errors. (7 Dec 1999)
Conformance Testing
Load and Multiply the modelview matrix (initialized to identity
each time) using LoadTransposeMatrixfARB and MultTransposeMatrixfARB
with the matrix:
( 1 2 3 4 )
( 5 6 7 8 )
( 9 10 11 12 )
(13 14 15 16 )
and get the modelview matrix using TRANSPOSE_MODELVIEW_MATRIX_ARB and
validate that the matrix is correct. Get the matrix using
MODELVIEW_MATRIX and verify that it is the transpose of the above
matrix. Load and Multiply the modelview matrix using LoadMatrixf
and MultMatrixf with the above matrix and verify that the correct
matrix is on the modelview stack using gets of MODELVIEW_MATRIX
and TRANSPOSE_MODELVIEW_MATRIX_ARB.