modelViewMatix.PushMatrix(viewFrame);
我們知道OpenGL是一個狀態(tài)機, 所以每次進行渲染時我們需要對所有狀態(tài)進行重置, 否則就會渲染錯誤.
例如,
glEnable(GL_BLEND);//開啟混合
shaderManager.UseStockShader(......);
xxBatch->Draw();//渲染
glDisable(GL_BLEND);//關(guān)閉混合
同理, 關(guān)于模型視圖矩陣的堆棧也需要重置操作, 所有提供了壓棧和出棧這種方式來解決.
我們來看一下整個壓棧出棧的流程, 矩陣堆棧中默認有一個單元矩陣
1.首先我們執(zhí)行壓棧操作, 代碼如下
modelViewMatrix.PushMatrix();
modelViewMatrix.PushMatrix(矩陣a);
壓棧流程圖
如圖所示, 如果參數(shù)為空, 首先將會對原始堆棧進行擴容, 之后copy棧頂?shù)木仃?
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. 渲染之后, 模型視圖矩陣執(zhí)行出棧操作.
modelViewMatrix.PopMatrix();
PopMatrix流程圖