如何在基本的openGL中进行矩阵乘法,而不需要使用GLUT或其他扩展包?比如说,我想要计算T*M的结果,其中T和M都是矩阵。在openGL中如何实现这个功能呢?
我知道有一个叫做glMultMatrix*()的函数,但它只是用结果替换当前的模型矩阵,并不是直接计算矩阵的方式。
如何在基本的openGL中进行矩阵乘法,而不需要使用GLUT或其他扩展包?比如说,我想要计算T*M的结果,其中T和M都是矩阵。在openGL中如何实现这个功能呢?
我知道有一个叫做glMultMatrix*()的函数,但它只是用结果替换当前的模型矩阵,并不是直接计算矩阵的方式。
glMultMatrix
和相关函数在较新版本的OpenGL中已被弃用(并从核心配置文件中删除)。相反,使用类似于GLM的库来执行矩阵乘法等任务会更好。
即使您要继续使用固定函数管道(和兼容性配置文件),这也可能是最好的选择。您可以使用glLoadMatrix
将结果上传到OpenGL,并且将更好地准备使用可编程管道(在其中将使用相同的矩阵设置着色器程序统一变量)。
#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内置一些矩阵操作函数,但除了初学者教程和简单程序之外,几乎没有任何严肃的程序实际使用它们,即使是15年前。这是因为大部分时间你还需要用到这些矩阵来进行碰撞检测、刚体力学等操作,并且保留冗余副本几乎没有意义。而且遗留OpenGL的矩阵API很难使用。
此外,请注意,执行单个4×4矩阵-矩阵乘法在CPU上比将其卸载到GPU上更有效(如果您需要执行成千上万次的矩阵乘法,所有这些都要执行同一个程序,则完全是另一回事)。
遗留OpenGL执行的矩阵数学仅涉及单个矩阵计算实例。所以使用它们没有计算上的好处;进入OpenGL实现的整个开销实际上像是减速带。