假设我有以下代码:
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轴旋转吗?
答案 0 :(得分:7)
一般情况下,如果您自己组装矩阵并通过glLoadMatrix或glMultMatrix加载它,您的程序将运行得更快。除非你在你自己的矩阵例程中犯了愚蠢的错误,否则会破坏当然的表现。
这是因为glRotate glTranslate等功能比纯数学运算要多得多。他们必须检查矩阵模式。 glRotate必须处理轴未作为单位向量等传递的情况。
但除非你每帧执行10万次,否则我不会担心失去的性能。它加起来,但并没有那么多。
我处理openGL转换的个人方法是在我的代码中构建矩阵,并通过glLoadMatrix将它们上传到OpenGL。这允许我做很多快捷方式,比如颠倒乘法的顺序(计算速度比OpenGL的方式快)。此外,它还允许我即时访问矩阵,如果您想在渲染之前进行边界框检查,则需要该矩阵。
毋庸置疑,用这种方法编写的代码也更容易移植到不同的图形API上(想想OpenGL | ES2,DirectX,Game-Consoles ......)
答案 1 :(得分:3)
根据OpenGL规范,glRotate和glTranslate正在使用它们的参数来生成4x4矩阵,然后将当前矩阵乘以(glRotate或glTranslate)生成的矩阵,产品替换当前矩阵。
这大致意味着在您的登记代码中您有4个矩阵乘法!最重要的是,您有4个API调用和一些其他计算,将glRotate的角度转换为4x4矩阵。
通过使用glLoadMatrix,您必须自己生成转换矩阵。拥有角度和平移有更有效的方法来产生转换矩阵,从而加速整个事物。
答案 2 :(得分:2)
这是否比通过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反模式中最差的。
提高渲染性能的最佳选择是避免在上面的示例中看到的任何模式。
答案 3 :(得分:1)
这些矩阵函数在驱动程序中实现,因此可能会进行优化。您将不得不花一些时间编写自己的代码,并测试性能是否优于原始OpenGL代码。
另一方面,在“新”版本的OpenGL中,所有这些功能都缺失并标记为已弃用。因此,在新标准中,您将被迫使用自定义数学函数(假设您使用的是Core配置文件)