OpenGL:实现转换矩阵栈

时间:2012-04-05 10:57:00

标签: opengl

在较新的OpenGL中没有矩阵堆栈。我正在研究一个简单的显示引擎,我将实现转换堆栈。

这里的常见策略是什么?我应该构建一个push / pop堆栈,并将它与代表我模型的树一起使用吗?我想这是“旧的”方法,在较新的OpenGL版本中已被弃用。也许那时候它不是最好的解决方案(由于某些原因它已被移除,我不知道)

4 个答案:

答案 0 :(得分:7)

  

(因某种原因被删除)

它已被删除,因为在现代3D应用程序中,整个OpenGL矩阵操作功能是高度冗余的。任何现代3D应用程序都需要处理矩阵,因为OpenGL不是一个合适的矩阵数学库,你可以使用像Eigen oder GSL或者homebrewn这样的东西。

堆栈仍然是一个非常可行的结构。

答案 1 :(得分:2)

我在这方面并不是非常有经验,但我已经做了很多图形/游戏开发。我有一个想法而不是一个答案。在我看来,glPushMatrixglPopMatrix的东西已被弃用,因为许多开发人员希望完全控制变换,而不是OpenGL为他们处理。所以我的想法是它们不被弃用,因为矩阵堆栈不是要走的路,而是因为GL开发人员应该自己处理矩阵,或者使用另一个库来为它们做这些。

换句话说,矩阵堆栈仍然是可行的方法,您只需自己动手,使用已弃用的功能或使用外部库。

答案 2 :(得分:2)

固定管道功能已被弃用,因为基本上它已修复。

为了支持新的技巧和一般需要的新OpenGL功能,很明显,持续支持所请求的功能意味着增加OpenGL API的大小并使其逐渐变得越来越笨重。

与此同时,硬件变得越来越复杂和强大,并且没有被OpenGL充分利用。因此构想了可编程管道。

使用OpenGL3,Kronos组“弃用”了固定管道功能。这引起了巨大的骚动,因为有很多代码和如此多的人才投入到完善的固定管道中,因此他们部分地回应了他们的决定,引入了“核心”和“兼容性”配置文件。核心配置文件包含新的可编程管道模型,兼容性配置文件包括核心以及大部分/全部固定功能,允许应用程序使用任一模型。

我们现在正在使用OpenGL 4.2,兼容性配置文件仍然存在,并且没有消失的迹象。

简而言之,弃用的原因并不是因为旧模型不适合应用程序员;相反,对于实现者来说,这是一个更沉重的负担。实际模型非常合理,许多使用可编程功能的应用程序/开发人员发现自己重新推出了固定功能的基本部分(glBegin,glEnd,矩阵堆栈,转换调用等)。

所以继续,实现自己的矩阵堆栈。但是,如果你想出更好的想法,请与我们分享:)

答案 3 :(得分:2)

不确定它对你有用,但我实现了两件事。第一个是带有所有常用方法的简单矩阵堆栈类,第二个是基于堆栈的RAII结构,它允许我用大括号对矩阵变化进行调整,即在构造时它存储对矩阵堆栈的引用,在破坏时它恢复矩阵堆叠回到以前的状态。所以你可以写:

MatrixStack stack;

stack.push(rotate...)
stack.push(translate...)

{
    MatrixScope(stack);

    stack.push(rotate...)    
}

... back to previous stack state.

除此之外,它只是为了方便某些类型的转换。通常,对于由网格树结构组成的模型,所有模型都相互转换,我会在对模型做任何事情之前将根节点中的矩阵组合起来。因此,每个网格具有局部变换和全局变换,全局变换是该网格相对于根节点的实际变换。所以不需要在那里使用矩阵堆栈。

如果您想独立于其余部分对网格的一部分进行动画处理,那就有点不同了,这就是为什么我还存储局部变换而不是丢弃它。