在OpenGL中存储和加载矩阵

时间:2012-11-11 11:03:27

标签: opengl graphics matrix

是否可以告诉OpenGL将当前转换矩阵存储在特定位置(而不是将其推入堆栈)并从特定位置加载矩阵?

我更喜欢在视频设备和主存储器之间不涉及额外数据传输的解决方案(即最好将矩阵存储在视频存储器中的某处)。

2 个答案:

答案 0 :(得分:9)

回答你问题的第一部分:

函数glLoadMatrix和glGet可以做到

// get current model view matrix
double matrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX, matrix)

// manipulate matrix

glLoadMatrixd(matrix);

请注意,OpenGL 4不再支持这些功能。无论如何,Matrix操作必须在应用程序站点上完成,并作为着色器程序的统一变量提供。

答案 1 :(得分:3)

在旧的固定功能流水线上,矩阵按需加载到一些特殊的GPU寄存器中,但从未在VRAM中,所有矩阵计算都发生在CPU上。在现代,OpenGL矩阵计算仍然在CPU上发生(并且正确),并且再次按需加载到称为“Uniforms”的寄存器中。然而,现代OpenGL还具有称为“统一缓冲区对象”的功能,允许从VRAM加载统一(寄存器)值。 http://www.opengl.org/wiki/Uniform_Buffer_Object

但它们对存储变换矩阵几乎没有用处。首先,您将不断更改它们以进行动画制作。其次,仅仅为简单矩阵管理UBO的开销比从CPU设置UACO要多得多。矩阵只有16个标量,或者相当于一个具有位置,法线,纹理坐标和切线属性的单个顶点。