在 OpenGL 中存储和加载矩阵


是否可以

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

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

回答你问题的第一部分:

函数glLoadMatrix和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加载统一(寄存器)值。http://www.opengl.org/wiki/Uniform_Buffer_Object

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

相关内容

  • 没有找到相关文章

最新更新