为什么在OpenGL中明确管理矩阵更好?

6
最近我在大量使用OpenGL,发现了让OpenGL管理视图/模型/投影矩阵和自己管理它们之间的区别,可以使用自己的矩阵实现或像GLM这样的库。我看到很多大型项目都有自己的相机管理(即管理自己的平移、旋转等)。我可以理解为什么这会有助于确保您对系统拥有完全控制,但除此之外,这似乎是为了微不足道的收益而付出了很多工作。

为什么自己管理比使用内置的OpenGL函数更好?显然,这是在着色器管线的上下文中,而不是固定功能默认情况下。

(这适用于任何3D库)。


5
我将避免进行负评,但我通常不喜欢以下形式的问题:“为什么做X比做Y更好?”这种问题预设了一种方法比另一种更好。如果你不知道“为什么”,那么你可能也不够资格知道哪个更好。更好的措辞应该是:“为什么[有些人]主张使用X而不是Y?” - R.. GitHub STOP HELPING ICE
我这样表达的原因是因为我看到的一切都表明明确地做这件事情更好,而且没有反对意见。我知道这是个糟糕的归纳论证,但我认为这会引起更多关注。不过,我同意你的观点,+1。 - jli
3个回答

7
作为一个旁白,OpenGL ES 2没有变换管理设施,因此在某些情况下你别无选择。更具体地说,我发现通过OpenGL内置的矩阵堆栈来管理矩阵有时会非常麻烦,迫使我在渲染代码的更复杂部分大量推入和弹出,甚至有时重新排序渲染以简化堆栈管理。我还编写了一个C ++推入者-弹出器类,使用RAII自动管理所有这些,但需要小心地限定局部变量的作用域。当我转换到ES 2时,我惊讶地发现所有那些功能都不见了。然而,我发现切换到自己的矩阵实际上简化了我的代码,因为我可以使用多个变换结合使用本地和成员变量(具有意义的名称)来工作,而不会在空间中迷失方向,并且变换堆栈主要是通过使用调用堆栈来替换的-i.e.当前变换只是一个本地矩阵变量,作为父变换参数传递给下一个函数,但具有以其他方式执行它的灵活性。

+1,好观点。在接受之前,我会等待更多潜在的答案。 - jli

3
有很多理由支持使用自己管理矩阵。苹果最近在 OSX Lion 中的 OpenGL 改进中提到了这一点:新的 OpenGL 规范(主要是 3.2 及以上版本)更加专注于表现 GPU 实际在做什么。在 OpenGL 2.1 中,所有的矩阵操作都发生在 CPU 上。因此,不仅没有使用 GL 矩阵的神奇加速效果,还被锁定在一个完全任意的矩阵管理模式中:只有投影和模型视图矩阵(对于顶点)、矩阵堆栈大小限制、有限的矩阵操作等等。
当你开始管理自己的矩阵时,你会看到为什么这样做更好。随着场景变得越来越复杂,你会发现需要更多的矩阵缓存(不仅仅是“投影”和“模型视图”),并且可以构建更有用的矩阵函数。比如,哪个更方便使用?glRotatef(90.0f, 1.0f, 0.0f, 0.0f); 还是 matrix.rotateX(90.0f);?我总觉得必须每次指定旋转轴非常麻烦!
当你开始认识到 CPU 操作和 GPU 操作之间的差异时,你会开始欣赏管理自己的矩阵。

+1 提到旧的GL矩阵操作不能在GPU上自动执行。 - Christian Rau

1

近期的OpenGL规范版本中,由GL管理的矩阵堆栈已被弃用。因此,未来自行管理是唯一的选择。


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