OpenGL中矩阵的存储与加载

OpenGL中矩阵的存储与加载,opengl,graphics,matrix,Opengl,Graphics,Matrix,可以告诉OpenGL将当前转换矩阵存储在特定位置(而不是将其推到堆栈上)并从特定位置加载矩阵吗 我更喜欢不涉及视频设备和主存储器之间额外数据传输的解决方案(即,最好将矩阵存储在视频存储器中的某个位置) 回答问题的第一部分: 函数和glGet可以做到这一点 // get current model view matrix double matrix[16]; glGetDoublev(GL_MODELVIEW_MATRIX, matrix) // manipulate matrix glLoa

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


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

回答问题的第一部分:

函数和glGet可以做到这一点

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

// manipulate matrix

glLoadMatrixd(matrix);

请注意,OpenGL 4不再支持这些函数。矩阵操作必须在应用程序现场进行,并作为统一变量提供给着色器程序。

在旧的固定功能管道上,矩阵按需加载到一些特殊的GPU寄存器中,但从未在VRAM中,所有矩阵计算都在CPU上进行。在现代OpenGL中,矩阵计算仍然在CPU上进行(没错),并根据需要再次加载到名为“制服”的寄存器中。然而,现代OpenGL还有一个称为“统一缓冲区对象”的功能,允许从VRAM加载统一(注册)值

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