在OpenGL中存储和加载矩阵(Storing and loading matrices in Op

2019-08-02 13:58发布

(而不是推栈上)是否可以告诉OpenGL存储在特定位置的当前转换矩阵,并从一个特定的位置加载一个矩阵?

我宁愿不涉及视频设备和主存储器之间的额外的数据传输(即它是更好的地方存储矩阵中的视频内存)的解决方案。

Answer 1:

在旧的固定功能管线的矩阵被按需加载到一些特殊的GPU寄存器,但从来没有人在VRAM,所有矩阵计算发生在CPU上。 在现代OpenGL的矩阵计算仍然发生在CPU(和右等等),并装入寄存器称为“制服”按需一次。 但是现代的OpenGL也有一个名为“统一缓冲对象”,允许从VRAM加载统一(寄存器)值的特征。 http://www.opengl.org/wiki/Uniform_Buffer_Object

但是,他们很少利用存储转换矩阵。 首先,你会不断地改变他们做动画。 其次,管理UBOs只是一个简单的矩阵的开销,吃多了更多的性能,比从CPU设置它。 矩阵是只有16标量,或者一个单个顶点的与位置,法线,纹理坐标和切线属性等效。



Answer 2:

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

功能glLoadMatrix和glGet能做到这一点

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

// manipulate matrix

glLoadMatrixd(matrix);

请注意,这些功能都没有使用OpenGL 4支持了。 矩阵运算必须反正在应用现场进行,作为统一的变量在着色器程序提供。



文章来源: Storing and loading matrices in OpenGL