2010-11-21 69 views
2

當在紅皮書中重塑的例子來看,我通常會找到這樣的:爲什麼重塑代碼以glMatrixMode(GL_MODELVIEW)結束?

void reshape(int w, int h) 
{ 

    glViewport(0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); 
    glMatrixMode(GL_MODELVIEW); 

} 

據我所知,調用glMatrixMode(GL_PROJECTION);其次glLoadIdentity();重置投影矩陣,但我不明白爲什麼glMatrixMode(GL_MODELVIEW)通常稱爲在重塑結束。

在這個特殊的例子glFrustum影響投影矩陣,對嗎?爲什麼後面調用GL_MODELVIEW?如果最後一次致電glMatrixMode(GL_MODELVIEW)被忽略,它會有所作爲嗎?

回答

3

大部分渲染代碼將影響GL_MODELVIEW,因爲它影響對象翻譯和相機位置。但是,調整大小的代碼適用於GL_PROJECTION。程序員可能會認爲當前矩陣是他的大部分代碼中的模型視圖,並且當需要影響另一個矩陣時,他/她會更改矩陣,更新矩陣,然後將目標更改回GL_MODELVIEW,以便剩下的該代碼不針對錯誤的矩陣。

一般來說,OpenGL函數會影響當前所有目標的矩陣,這就是爲什麼您要更改矩陣。

+0

如果最後一次調用glMatrixMode(GL_MODELVIEW)被忽略,它會有所作爲嗎? – andandandand 2010-11-22 00:26:56

+4

是的 - 除非你把它放在別的地方。基本上大部分的矩陣運算都是在模型視圖矩陣上完成的(投影矩陣只能在每個窗口調整大小,或者每次運行一次),所以您希望模型視圖矩陣堆棧成爲活動矩陣堆棧(即受所有矩陣調用)。這就是爲什麼趨勢是「如果你想修改其他矩陣堆棧,然後打開它,做你的東西,並恢復到模型視圖」。 – Kos 2010-11-22 00:33:03

相關問題