OpenGL中矩阵的存储方式

本文详细解析了OpenGL中矩阵的存储方式,强调其列优先特性,并对比了一般数学书籍中的行优先方式。介绍了如何使用一维数组保存矩阵,以及如何通过ARB_transpose_matrix函数在两种存储方式间进行转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自skyman_2001的博客
在OpenGL中,
矩阵是以列优先的方式(column-major order)存储的,
而一般的数学书上是以行优先的方式(row-major order)存储的。

列优先

m0 m4 m8 m12

m1 m5 m9 m13

m2 m6 m10 m14

m3 m7 m11 m15

行优先

m0 m1 m2 m3

m4 m5 m6 m7

m8 m9 m10 m11

m12 m13 m14 m15

在OpenGL中,矩阵是用一维数组来保存的:m[16]。

可以用ARB_transpose_matrix来实现2者的转换:

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.

提供的函数:

void LoadTransposeMatrix{fd}ARB(T m[16]);
void MultTransposeMatrix{fd}ARB(T m[16]);

提供的标记(对GetBooleanv, GetIntegerv, GetFloatv, GetDoublev函数):

TRANSPOSE_MODELVIEW_MATRIX_ARB
TRANSPOSE_PROJECTION_MATRIX_ARB
TRANSPOSE_TEXTURE_MATRIX_ARB
TRANSPOSE_COLOR_MATRIX_ARB

LoadTransposeMatrixARB(m)相当于:

float n[16];
transpose(m,n)
LoadMatrix(n);

MultTransposeMatrixARB(m)相当于:

float n[16];
transpose(m,n);
MultMatrix(n);

GetFloatv(TRANSPOSE_MODELVIEW_MATRIX_ARB,m)相当于:

float n[16];
GetFloatv(MODELVIEW_MATRIX_ARB,n);
transpose(n,m);

TRANSPOSE_PROJECTION_MATRIX_ARB,TRANSPOSE_TEXTURE_MATRIX_ARB和 TRANSPOSE_COLOR_MATRIX_ARB类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值