OpenGL中矩陣堆棧的壓棧和出棧操作理解

OpenGL中矩陣堆棧的頻繁壓棧和出棧操作往往是入門時最大的門檻,也是最容易造成困惑的地方踊淳,今天我們來詳細(xì)理解一下假瞬。
要了解壓棧出棧,首先要搞清楚OpenGL的狀態(tài)機(jī)是個什么東西迂尝。OpenGL基礎(chǔ)概念中講述了狀態(tài)機(jī)的概念脱茉,本文不多做闡述,簡單來說垄开,OpenGL會記錄下我們設(shè)置的各種狀態(tài)琴许,參數(shù),開關(guān)等等溉躲,不會默認(rèn)恢復(fù)榜田。

(簡單舉例理解:)
我們打開燈的開關(guān),燈就一直亮著签财,不會自動恢復(fù)串慰。

對狀態(tài)機(jī)了解之后,結(jié)合繪圖的渲染過程唱蒸,我們知道每次繪制時邦鲫,我們會使用各種不同的參數(shù),函數(shù)神汹,打開OpenGL各種功能(例如 開啟深度測試庆捺,開啟混合呆贿,開啟正背面提出)等等嫡意,而繪制完畢我們需要手動關(guān)閉,那么同樣歼捐,存儲在棧中的矩陣也是如此氓拼。

當(dāng)我們使用模型視圖矩陣來記錄物體的基礎(chǔ)位置你画,各種變化等 時,我們往往也需要手動恢復(fù)矩陣的內(nèi)容桃漾。這就是我們經(jīng)常使用的PushMatrixPopMatrix坏匪。

  • 為什么需要恢復(fù)?
    mv(模型視圖矩陣撬统,下文簡稱mv)是全局的适滓,每次繪制都會使用,而我們在做物體變化時都是基于單元矩陣進(jìn)行操作的(并非一定如此恋追,大多數(shù)情況凭迹,也有可能一個永遠(yuǎn)不變的物體如地板罚屋,我們就不需要壓出棧)。每個不同的變化都有自己單獨的記錄方式嗅绸,而我們實現(xiàn)效果利用不同的變化記錄值和模型視圖矩陣叉乘脾猛,如果每次不恢復(fù),那么我們需要計算基于當(dāng)前mv(此時mv中已經(jīng)結(jié)合了本次變化的結(jié)果)和變換叉乘結(jié)果來實現(xiàn)其他變化的效果朽砰。否則其他變換則會混入本次變化尖滚,即在本次變換的基礎(chǔ)上又進(jìn)行變化,就會出現(xiàn)不可預(yù)計的結(jié)果(俗稱亂套瞧柔,鬼畜,尤其在多次變換時)睦裳。

不懂造锅?舉例:
我們有一個需求:物體進(jìn)行仿射變化,平移和旋轉(zhuǎn)廉邑,平移和旋轉(zhuǎn) 我們有兩個float來記錄平移舉例和旋轉(zhuǎn)角度哥蔚,那么
1- 繪制平移,我們用mv叉乘平移距離蛛蒙,繪制糙箍。恢復(fù)牵祟。
2- 繪制旋轉(zhuǎn)深夯,mv叉乘旋轉(zhuǎn)角度,繪制诺苹,恢復(fù)咕晋。

如果不恢復(fù)呢?
1- 繪制平移收奔,mv叉乘平移距離掌呜,繪制
2- 繪制旋轉(zhuǎn),mv(第一步叉乘平移后的結(jié)果)坪哄,叉乘旋轉(zhuǎn)
那么會是什么效果呢质蕉? 顯然,我們需要一次平移翩肌,一次旋轉(zhuǎn)模暗,而上述方法結(jié)果平移了兩次,旋轉(zhuǎn)了一次摧阅。
只是兩個變化是這個結(jié)果汰蓉,持續(xù)變換呢?結(jié)果可想而知棒卷。

總結(jié)(引用老鐵的話):

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結(jié)合就OK了

最后簡單理解一下push和pop到底干了啥(引用自OpenGL基礎(chǔ)變化綜合練習(xí)實踐總結(jié)

矩陣入棧相乘出棧

可以理解為慷荔,push->記錄本次變化,pop->恢復(fù)本次變化缠俺, 通俗意思就是我這次該干的干完了显晶,我收拾干凈,你們在弄你們的壹士。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磷雇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躏救,更是在濱河造成了極大的恐慌唯笙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件落剪,死亡現(xiàn)場離奇詭異睁本,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忠怖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門呢堰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凡泣,你說我怎么就攤上這事枉疼。” “怎么了鞋拟?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵骂维,是天一觀的道長。 經(jīng)常有香客問我贺纲,道長航闺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮潦刃,結(jié)果婚禮上侮措,老公的妹妹穿的比我還像新娘。我一直安慰自己乖杠,他們只是感情好分扎,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胧洒,像睡著了一般畏吓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卫漫,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天菲饼,我揣著相機(jī)與錄音,去河邊找鬼列赎。 笑死巴粪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粥谬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辫塌,長吁一口氣:“原來是場噩夢啊……” “哼漏策!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臼氨,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掺喻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后储矩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體感耙,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年持隧,在試婚紗的時候發(fā)現(xiàn)自己被綠了即硼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡屡拨,死狀恐怖只酥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呀狼,我是刑警寧澤裂允,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站哥艇,受9級特大地震影響绝编,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一十饥、第九天 我趴在偏房一處隱蔽的房頂上張望窟勃。 院中可真熱鬧,春花似錦绷跑、人聲如沸拳恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谬运。三九已至,卻和暖如春垦藏,著一層夾襖步出監(jiān)牢的瞬間梆暖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工掂骏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留轰驳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓弟灼,卻偏偏與公主長得像级解,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子田绑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容