如何在OpenGL中进行矩阵乘法

4

如何在基本的openGL中进行矩阵乘法,而不需要使用GLUT或其他扩展包?比如说,我想要计算T*M的结果,其中T和M都是矩阵。在openGL中如何实现这个功能呢?

我知道有一个叫做glMultMatrix*()的函数,但它只是用结果替换当前的模型矩阵,并不是直接计算矩阵的方式。


你的问题是限制在4x4矩阵吗?还是你需要通用大小矩阵乘法的代码? - Øystein Schønning-Johansen
顺便问一下,你为什么要问这个问题呢?你需要额外的性能并希望在GPU上执行乘法吗?如果是这样,我宁愿尝试使用SSE或AVX(或任何可用的SIMD)来进行乘法运算。 - Øystein Schønning-Johansen
3
ogl是关于渲染东西而不是数学。请使用像http://glm.g-truc.net/这样的优秀库来处理此类内容。 - cfrick
如何矩阵相乘在最新的GL版本中留给读者自己练习。 - user1095108
@oysteijo 因为ogl使用44矩阵来处理变换问题,所以我认为我们将其限制在44就足够了。感谢您所有的回答,这个问题可以通过CantChooseUsernames提供的代码解决。但是我对OpenGL的原理有了很多了解。非常感谢! - user3367705
3个回答

5

glMultMatrix和相关函数在较新版本的OpenGL中已被弃用(并从核心配置文件中删除)。相反,使用类似于GLM的库来执行矩阵乘法等任务会更好。

即使您要继续使用固定函数管道(和兼容性配置文件),这也可能是最好的选择。您可以使用glLoadMatrix将结果上传到OpenGL,并且将更好地准备使用可编程管道(在其中将使用相同的矩阵设置着色器程序统一变量)。


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

谢谢你快速并准确的回答!但是OpenGL有没有一些内置函数来完成这项工作呢?因为这是相当常见的计算。 - user3367705
@user3367705 现代OpenGL没有任何关于矩阵数学的内容。 - Dr. Snoopy
这是一个不错的答案。但是,这是标准矩阵乘法,它只会减慢你的速度。 - Beyondo

1
我想计算T*M的结果,其中T和M都是矩阵。如何在OpenGL中实现它?
你不能这样做,因为OpenGL不是一个数学库。OpenGL是一个绘图API:你提供一些数据(几何形状、纹理、已经准备好的矩阵),它会根据你的指令绘制图片。除此之外的任何事情都超出了OpenGL的范围。

遗留OpenGL内置一些矩阵操作函数,但除了初学者教程和简单程序之外,几乎没有任何严肃的程序实际使用它们,即使是15年前。这是因为大部分时间你还需要用到这些矩阵来进行碰撞检测、刚体力学等操作,并且保留冗余副本几乎没有意义。而且遗留OpenGL的矩阵API很难使用。

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

遗留OpenGL执行的矩阵数学仅涉及单个矩阵计算实例。所以使用它们没有计算上的好处;进入OpenGL实现的整个开销实际上像是减速带。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接