关于OpenGL的压栈

modelViewMatix.PushMatrix(viewFrame);

我们知道OpenGL是一个状态机, 所以每次进行渲染时我们需要对所有状态进行重置, 否则就会渲染错误.

例如,

glEnable(GL_BLEND);//开启混合
shaderManager.UseStockShader(......);
xxBatch->Draw();//渲染
glDisable(GL_BLEND);//关闭混合

同理, 关于模型视图矩阵的堆栈也需要重置操作, 所有提供了压栈和出栈这种方式来解决.

我们来看一下整个压栈出栈的流程, 矩阵堆栈中默认有一个单元矩阵

1.首先我们执行压栈操作, 代码如下
modelViewMatrix.PushMatrix(); 
modelViewMatrix.PushMatrix(矩阵a);
压栈流程图

如图所示, 如果参数为空, 首先将会对原始堆栈进行扩容, 之后copy栈顶的矩阵.

2. 进行矩阵变换, 得到我们想要的变化的目标堆栈, 代码如下.
    modelViewMatrix.MultMatrix(mCamera);
    
    //源码如下
    void PushMatrix(const M3DMatrix44f mMatrix) {
            if(stackPointer < stackDepth) {
                stackPointer++;
                m3dCopyMatrix44(pStack[stackPointer], mMatrix);
                }
            else
                lastError = GLT_STACK_OVERFLOW;
            }
      }
MultMatrix流程图

如图所示, 矩阵b和栈顶矩阵a相乘得到目标矩阵, 并替换掉栈顶矩阵a.

3. 渲染之后, 模型视图矩阵执行出栈操作.
modelViewMatrix.PopMatrix();
PopMatrix流程图

总结:

由于OpenGL上下文是一个巨⼤的状态机,切换上下文往往会产生较大的开销,但是不同的绘制模块,可能需要使用完全独立的状态管理。因此,可以在应用程序中分别创建多个不同的上下文,在不不同线程中使⽤不同的上下文,上下文之间共享纹理理、缓冲区等资源。这样的⽅案,会⽐反复切换上下文,或者大量修改渲染状态,更加合理高效的.

你可能感兴趣的:(关于OpenGL的压栈)