美文网首页
OpenGL中矩阵堆栈的压栈和出栈操作理解

OpenGL中矩阵堆栈的压栈和出栈操作理解

作者: lb_ | 来源:发表于2019-05-24 20:29 被阅读0次

OpenGL中矩阵堆栈的频繁压栈和出栈操作往往是入门时最大的门槛,也是最容易造成困惑的地方,今天我们来详细理解一下。
要了解压栈出栈,首先要搞清楚OpenGL的状态机是个什么东西。OpenGL基础概念中讲述了状态机的概念,本文不多做阐述,简单来说,OpenGL会记录下我们设置的各种状态,参数,开关等等,不会默认恢复。

(简单举例理解:)
我们打开灯的开关,灯就一直亮着,不会自动恢复。

对状态机了解之后,结合绘图的渲染过程,我们知道每次绘制时,我们会使用各种不同的参数,函数,打开OpenGL各种功能(例如 开启深度测试,开启混合,开启正背面提出)等等,而绘制完毕我们需要手动关闭,那么同样,存储在栈中的矩阵也是如此。

当我们使用模型视图矩阵来记录物体的基础位置,各种变化等 时,我们往往也需要手动恢复矩阵的内容。这就是我们经常使用的PushMatrixPopMatrix

  • 为什么需要恢复?
    mv(模型视图矩阵,下文简称mv)是全局的,每次绘制都会使用,而我们在做物体变化时都是基于单元矩阵进行操作的(并非一定如此,大多数情况,也有可能一个永远不变的物体如地板,我们就不需要压出栈)。每个不同的变化都有自己单独的记录方式,而我们实现效果利用不同的变化记录值和模型视图矩阵叉乘,如果每次不恢复,那么我们需要计算基于当前mv(此时mv中已经结合了本次变化的结果)和变换叉乘结果来实现其他变化的效果。否则其他变换则会混入本次变化,即在本次变换的基础上又进行变化,就会出现不可预计的结果(俗称乱套,鬼畜,尤其在多次变换时)。

不懂?举例:
我们有一个需求:物体进行仿射变化,平移和旋转,平移和旋转 我们有两个float来记录平移举例和旋转角度,那么
1- 绘制平移,我们用mv叉乘平移距离,绘制。恢复。
2- 绘制旋转,mv叉乘旋转角度,绘制,恢复。

如果不恢复呢?
1- 绘制平移,mv叉乘平移距离,绘制
2- 绘制旋转,mv(第一步叉乘平移后的结果),叉乘旋转
那么会是什么效果呢? 显然,我们需要一次平移,一次旋转,而上述方法结果平移了两次,旋转了一次。
只是两个变化是这个结果,持续变换呢?结果可想而知。

总结(引用老铁的话):

mv只有一个是全局的大家都在用,如果你某个图形A,他要有bcdefg变化,那么 push -> mvbcdefg -> pop mv,这时候物体B有个一个abc999-366的变化,push -> mv * abc999-366 ->pop ->mv, A和B都是要自己的变化,比如A必须要bcdefg都叉乘了才可作为A的最后的mv渲染,B也是同理,你把A的mvbcdefg abc999-366给B,那就乱套了,你要的最终变化给你就行了,别人的不要管
谁的变化给谁,push pop结合就OK了

最后简单理解一下push和pop到底干了啥(引用自OpenGL基础变化综合练习实践总结

矩阵入栈相乘出栈
可以理解为,push->记录本次变化,pop->恢复本次变化, 通俗意思就是我这次该干的干完了,我收拾干净,你们在弄你们的。

相关文章

  • OpenGL中矩阵堆栈的压栈和出栈操作理解

    OpenGL中矩阵堆栈的频繁压栈和出栈操作往往是入门时最大的门槛,也是最容易造成困惑的地方,今天我们来详细理解一下...

  • OpenGL笔记六:纹理常用API(一)

    前言 期待您移步上篇:OpenGL笔记五:综合实例理解-压栈、出栈、堆栈矩阵相乘、矩阵相乘、向量相乘 纹理 纹理只...

  • OpenGL 出栈压栈理解分析

    1.OpenGL压栈出栈作用概念 1.压栈出栈操作的是矩阵,一般分为模型视图矩阵和投影矩阵 2.出栈压栈是针对顶点...

  • OpenGL_矩阵压栈和出栈

    1. 压栈和出栈的理解 压栈出栈操作的是矩阵 用来记录矩阵的状态 压栈PushMatrix和出栈PopMatrix...

  • OpenGL学习笔记五

    使⽤矩阵堆栈 压栈.出栈 压栈: 存储一个状态出栈: 恢复⼀个状态 仿射变换

  • 压栈、出栈总结

    一 关于堆栈的理解 二 OpenGL压栈、出栈 https://www.jianshu.com/p/ce3b51b...

  • OpenGL-矩阵与向量

    OpenGL的矩阵操作 旋转 平移 缩放 压栈/出栈 单位向量-X轴-(1,0,0) 单位矩阵-X,Y,Z 三轴...

  • OPenGL 中的矩阵压栈/出栈

    我们知道OPenGL 中的图形变化是用矩阵来记录保存的.OpenGL 矩阵基础变化 简单来讲,当你做了一些移动或旋...

  • OpenGL 矩阵堆栈

    矩阵堆栈的使用 压栈、出栈 根据上述API的说明,可以根据一张图,清楚地查看堆栈信息的变化 当使用PushMatr...

  • OpenGL向量/矩阵、压栈/出栈

    我们大家可能对矩阵的乘法有点模糊了,不用担心!我们在这里只需要先明白向量、矩阵的含义,以及在OpenGL中的作用,...

网友评论

      本文标题:OpenGL中矩阵堆栈的压栈和出栈操作理解

      本文链接:https://www.haomeiwen.com/subject/qvwnzqtx.html