如何在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中将矩阵相乘的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将两个矩阵相乘

在 MPI C 中将矩阵和向量相乘

如何将顶点与顶点着色器外的模型矩阵相乘

如何理解矩阵相乘的几何意义或现实意义

线性代数中矩阵相乘如何计算啊

OpenGL 3.0 窗口碰撞检测