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流程图