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

jli*_*jli 6 c c++ opengl matrix

最近,我一直在使用OpenGL搞错了很多,而且我在允许OpenGL管理视图/模型/投影矩阵或自己管理它们之间遇到了分歧,无论是使用自己的矩阵实现还是像GLM这样的库.我已经看到很多大型项目都有自己的相机管理(即管理自己的翻译,轮换等).我可以看出为什么它可以帮助确保你完全控制系统,但除此之外,似乎很多工作获得了边际收益.

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

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

Mar*_*tos 7

(另外,OpenGL ES 2没有转换管理功能,所以在某些情况下你别无选择.)

更重要的是,我发现通过OpenGL的内置矩阵堆栈管理矩阵有时是一种真正的痛苦,迫使我在渲染代码的更复杂部分中大量推送和弹出,甚至有时重新排序渲染简化堆栈管理.我还编写了一个C++ pusher-popper类,它使用RAII自动管理所有这些,但它需要仔细确定局部变量.

当我切换到ES 2时,我很沮丧地得知所有功能都消失了.然而,我发现切换到我自己的矩阵实际上简化了我的代码,因为我可以使用局部变量和成员变量(具有有意义的名称)的组合来处理多个变换而不会在空间中丢失,并且变换栈主要通过使用来替换调用堆栈 - 即,当前变换是一个正常的局部矩阵变量,它作为父变换参数传递给下一个函数 - 但可以灵活地在其他时间以不同方式执行.