glMultMatrix/glLoadMatrix比glRotatef或gltranslate更有效

glMultMatrix/glLoadMatrix more efficient than glRotatef, or glTranslatef?

本文关键字:gltranslate 有效 glRotatef glLoadMatrix glMultMatrix      更新时间:2023-10-16

假设我有以下代码:

glRotatef(angle, 1.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(0.0f, 0.0f -5.0f);

这是否比通过glLoadMatrix函数实现相同功能使用自己的自定义矩阵效率低?

同样,我知道当矩阵相乘形成自定义线性变换时,最后一个矩阵相乘是第一个变换发生。同样,如果我使用上述代码,情况也是如此吗?它会平移,然后绕Z轴旋转,然后绕y轴和x轴旋转吗?

一般来说,如果你自己组装矩阵并通过glLoadMatrix或glMultMatrix加载它,你的程序会运行得更快。除非你在自己的矩阵例程中犯了愚蠢的错误,破坏了性能。

这是因为glRotate glTranslate等函数做的比纯粹的数学要多得多。他们必须检查矩阵模式。glRotate必须处理轴不是作为单位矢量传递的情况。

但除非你每帧这样做10,000次,否则我不会担心性能损失。它加起来,但没有那么多。

我个人处理openGL变换的方式是在我的代码中构建矩阵,只通过glLoadMatrix将它们上传到openGL。这允许我做很多快捷方式,比如颠倒乘法的顺序(比OpenGL更快的计算方式)。此外,它给了我即时访问矩阵,这是需要的,如果你想在渲染前做边界框检查。

不用说,用这种方法编写的代码也更容易移植到不同的图形API(想想OpenGL|ES2, DirectX, game -游戏机…)

根据OpenGL规范,glRotate和glTranslate使用它们的参数来产生4x4矩阵,然后当前矩阵乘以(glRotate或glTranslate)产生的矩阵,乘积替换当前矩阵。

这大致意味着在你的代码中你有4个矩阵乘法!最重要的是,你有4个API调用和一些其他的计算,将glRotate的角度转换为4x4矩阵。

通过使用glLoadMatrix,你必须自己生成变换矩阵。有了角度和平移有更有效的方法来生成变换矩阵从而加速整个过程。

这是否比通过glLoadMatrix函数实现相同功能使用自己的自定义矩阵效率低?

很有可能。然而,如果你遇到变换矩阵的设置成为瓶颈的情况,你就做了一些根本错误的事情。在一个合理编写的实时图形程序中,变换矩阵的计算应该只处理非常少的东西。

一个非常糟糕的编程的例子是这样的(伪代码):
glMatrixMode(GL_MODELVIEW)
for q in quads:
    glPushMatrix()
    glTranslatef(q.x, q.y, q.z)
    glBindTexture(GL_TEXTURE_2D, q.texture)
    glBegin(GL_QUADS)
    for v in [(0,0), (1,0), (1,1), (0,1)]:
        glVertex2f(v[0], v[1]
    glEnd()
    glPopMatrix()
像这样的代码将执行得非常差。首先,你要花费大量的时间来计算每个四边形的新变换矩阵,然后你为每个四边形重新启动一个原始批处理,纹理开关杀死缓存,最后但并非最不重要的是它使用即时模式。事实上,上面的代码是所有OpenGL反模式中最糟糕的一个例子。

提高渲染性能的最佳方法是避免上面示例中出现的任何模式。

这些矩阵函数是在驱动程序中实现的,所以它们可能会被优化。你将不得不花费一些时间来编写自己的代码,并测试性能是否比原始的OpenGL代码更好。

另一方面,在"新"版本的OpenGL中,所有这些函数都缺失并标记为已弃用。因此,在新标准中,您被迫使用自定义数学函数(假设您正在使用Core profile)