glMultMatrix/glLoadMatrix比glRotatef或gltranslate更有效
glMultMatrix/glLoadMatrix more efficient than glRotatef, or glTranslatef?
假设我有以下代码:
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)
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 递归函数有效,但无法记忆
- 在C++中初始化向量映射的最有效方法
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 如何有效地在 std::vector 中插入一对?
- C++模板 t 不是有效的模板类型
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- glMultMatrix/glLoadMatrix比glRotatef或gltranslate更有效