3

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

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

4

2 回答 2

9

要回答您问题的第一部分:

函数glLoadMatrix和 glGet 可以做到这一点

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

// manipulate matrix

glLoadMatrixd(matrix);

请注意,OpenGL 4 不再支持这些函数。无论如何,矩阵运算必须在应用程序站点上完成,并作为统一变量提供给着色器程序。

于 2012-11-11T11:28:06.993 回答
3

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

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

于 2012-11-11T12:15:59.193 回答