如何在openGL中将矩阵相乘
Posted
技术标签:
【中文标题】如何在openGL中将矩阵相乘【英文标题】:How to Multiply Matrices in openGL 【发布时间】:2014-03-01 08:34:02 【问题描述】:如何在没有 GLUT 或其他扩展包的情况下在基本的 openGL 中乘以矩阵? 说,我想计算 T*M 的结果,T 和 M 都是矩阵。如何在openGL中实现?
我知道就是这样的函数,叫做 glMultMatrix*()。但它只用结果替换当前模型矩阵。而且不是直接计算矩阵的方法。
【问题讨论】:
您的问题是否仅限于 4x4 矩阵,还是您想要用于一般大小的矩阵乘法的代码? 顺便说一句:你为什么首先问这个问题?您是否需要额外的性能并希望在 GPU 上执行乘法?在这种情况下,我宁愿尝试使用 SSE 或 AVX(或任何可用的 SIMD)进行乘法运算。 ogl 是关于渲染东西而不是数学。为自己找一些像样的图书馆glm.g-truc.net 如何将矩阵相乘留给最近的 GL 版本作为“读者练习”。 @oysteijo 因为 ogl 使用 4*4 矩阵来处理转换问题,所以我认为我们将其限制为 4*4 就足够了。感谢您的所有回答,可以通过 CantChooseUsernames 提供的代码解决。但是我学到了很多关于openGL的原理。非常感谢! 【参考方案1】:glMultMatrix
和相关函数在最新版本的 OpenGL 中已被弃用(并已从核心配置文件中删除)。而是使用诸如 GLM 之类的库来执行诸如矩阵乘法(等等)之类的任务。
即使您想继续使用固定功能管道(和兼容性配置文件),这也可能是可行的方法。您可以使用glLoadMatrix
将结果上传到 OpenGL,这样您就可以更好地使用可编程管道(您将使用相同的矩阵来设置着色器程序统一)。
【讨论】:
【参考方案2】:那(http://ideone.com/EsQkAR)呢:
#include <iostream>
void Multiply(float N[4][4], float M[4][4], float Result[4][4])
for (int I = 0; I < 4; ++I)
for (int J = 0; J < 4; ++J)
float SumElements = 0.0f;
for (int K = 0; K < 4; ++K)
SumElements += M[I][K] * N[K][J];
Result[I][J] = SumElements;
void Print(float mat[4][4])
for (int i = 0; i < 4; ++i)
for (int j = 0; j < 4; ++j)
std::cout<<mat[i][j]<<" ";
std::cout<<"\n";
int main()
float N[4][4] =
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16
;
float M[4][4] =
1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16
;
float Result[4][4];
Multiply(N, M, Result);
Print(Result);
【讨论】:
感谢您快速且实用的正确答案!但是openGL没有一些内置函数来完成这项工作吗?因为这是一个很常见的计算。 @user3367705 现代 OpenGL 没有任何用于矩阵数学的东西。 这是一个很好的答案。但是,这是标准矩阵乘法,它只会减慢你的速度。【参考方案3】:我想计算 T*M 的结果,T 和 M 都是矩阵。如何在openGL中实现?
你不会,因为 OpenGL 不是一个数学库。 OpenGL 是一个绘图 API:您将一些数据(几何、纹理、准备使用的矩阵)交给它,它会使用这些数据为您的命令绘制图片。其他任何东西都超出了 OpenGL 的范围。
旧版 OpenGL 内置了一些矩阵操作函数,但除了初学者教程和简单程序之外,几乎没有任何严肃的程序真正使用过它们,即使是 15 年前也是如此。这样做的原因是,大多数时候你还需要这些矩阵来处理碰撞检测、刚体力学等,而且保留冗余副本几乎没有意义。旧版 OpenGL 的矩阵 API 使用起来很麻烦。
另外请注意,在 CPU 上执行单个 4×4 矩阵-矩阵乘法比将其卸载到 GPU 上更有效(如果您有数千个矩阵乘法要执行,全部在同一个程序中执行,这是一个完全不同的故事)。
传统 OpenGL 执行的矩阵数学仅涉及矩阵计算的单个实例。所以使用它们没有计算上的好处;哎呀,进入 OpenGL 实现的整个开销实际上就像一个减速带。
【讨论】:
以上是关于如何在openGL中将矩阵相乘的主要内容,如果未能解决你的问题,请参考以下文章