最近我用OpenGL搞错了很多,我遇到了允许OpenGL管理视图/模型/投影矩阵或自己管理它们之间的区别,要么是你自己的矩阵实现,要么是库等作为GLM。我已经看到很多大型项目都有自己的相机管理(即管理自己的翻译,轮换等)。我可以看出为什么它有助于确保你完全控制系统,但除此之外,似乎还有很多工作可以获得边际收益。
为什么自己管理比使用内置的OpenGL功能更好?显然,这是在着色器管道的上下文中,而不是固定的函数默认值。
(这适用于任何3D库)。
答案 0 :(得分:7)
(另外,OpenGL ES 2没有转换管理功能,所以在某些情况下你别无选择。)
更重要的是,我发现通过OpenGL的内置矩阵堆栈管理矩阵有时会非常痛苦,迫使我在渲染代码的更复杂部分中大量推送和弹出,甚至重新排序渲染有时只是为了简化堆栈管理。我还编写了一个C ++ pusher-popper类,它使用RAII自动管理所有这些,但它需要仔细确定局部变量。
当我切换到ES 2时,我惊愕地发现所有功能都消失了。然而,我发现切换到我自己的矩阵实际上简化了我的代码,因为我可以使用局部变量和成员变量(具有有意义的名称)的组合来处理多个变换而不会在空间中丢失,并且变换栈主要通过使用来替换调用堆栈 - 即,当前变换是一个正常的局部矩阵变量,它作为父变换参数传递给下一个函数 - 但可以灵活地在其他时间以不同方式执行。
答案 1 :(得分:3)
最好有大量原因。 Apple最近在OSX Lion上对OpenGL改进的介绍说得最好:较新的OpenGL规范(主要是3.2 on up)更专注于代表GPU实际做的事情。在OpenGL 2.1中,所有矩阵操作都在CPU上进行。因此,使用GL矩阵不仅没有神奇的加速优势,而且你被锁定在完全任意的矩阵管理模型中:投影和放大器。仅模型视图矩阵(用于顶点),矩阵堆栈大小限制,一组有限的矩阵运算等。
当你开始管理你自己的矩阵时,你会开始明白为什么它会好得多。随着场景变得越来越复杂,您开始看到需要更多矩阵缓存(不仅仅是“投影”和“模型视图”)。您将发现构建更有用的矩阵函数的机会。例如,哪个听起来更舒服? glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
或matrix.rotateX(90.0f);
?我一直困扰着我必须每次都指定旋转轴!
当您开始认识到CPU操作和GPU操作之间的差异时,您将会喜欢管理自己的矩阵。
答案 2 :(得分:1)
GL管理的矩阵堆栈在最近的转速中已弃用。 OpenGL规范所以继续自己管理它们只是 选项。