如何在openGL中乘以矩阵

时间:2014-03-01 08:34:02

标签: c++ opengl matrix

如何在没有GLUT或其他扩展包的情况下在基本的openGL中相乘矩阵? 说,我想计算T * M的结果,T和M都是矩阵。如何在openGL中实现它?

我知道这是一个名为 glMultMatrix *()的功能。但它只能用结果取代当前的模型矩阵。而且它不是直接计算矩阵的方法。

3 个答案:

答案 0 :(得分:4)

在更新版本的OpenGL中,不推荐使用

glMultMatrix及相关函数(并从核心配置文件中删除)。而是使用诸如GLM之类的库来执行诸如矩阵乘法(以及更多)之类的任务。

即使您想继续使用固定功能管道(以及兼容性配置文件),这也许是可行的方法。你可以使用glLoadMatrix将结果上传到OpenGL,你可以更好地使用可编程管道向前推进(你将使用相同的矩阵来设置着色器程序统一)。

答案 1 :(得分:1)

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);
}

答案 2 :(得分:0)

  

我想计算T * M的结果,T和M都是矩阵。如何在openGL中实现它?

你没有,因为OpenGL不是数学库。 OpenGL是一个绘图API:你可以提供一些数据(几何,纹理,随时可用的矩阵),它将使用它来绘制图片到你的命令。其他任何东西都超出了OpenGL的范围。


Legacy OpenGL内置了一些矩阵操作功能,但除了初学者的教程和简单的程序之外,几乎没有任何严肃的程序确实使用它们,甚至15年前。原因在于,大多数时候你还需要那些矩阵,比如碰撞检测,刚体力学等等,并且保留冗余副本几乎没有意义。传统的OpenGL矩阵API使用起来很麻烦。

另请注意,在CPU上执行单个4×4矩阵 - 矩阵乘法比在将其卸载到GPU上更有效(如果要执行数千次矩阵乘法,则所有这些都是相同的程序,这是一个完全不同的故事。)

传统OpenGL执行的矩阵数学只是关于矩阵计算的单个实例。所以使用它们没有计算好处;进入OpenGL实现的整个开销实际上就像一个减速带。