OpenGL 圖元的渲染-矩陣堆棧

之前的創(chuàng)建文章都是用MarkDown編輯器 沒想到最近創(chuàng)建的都是富文本編輯器,也沒有發(fā)布更新看下效果 結(jié)果現(xiàn)在要把文章都重新發(fā)布一邊 惆悵

圖元基本連接方式

OpenGL 基本圖元連接方式

圖元連接方式
GL_TRIANGLE_STRIP優(yōu)點:
  • 用前3個頂點指定第1個三角形之后,接下來的每?個三?形,只需要再指定1個頂點长酗。需要繪制?量的三?形時竟贯,采?這種?法可以節(jié)省?大量的程序代碼和數(shù)據(jù)存儲空間偿短。
  • 提供運算性能和節(jié)省帶寬泄鹏。更少的頂點意味著數(shù)據(jù)從內(nèi)存?zhèn)鬏數(shù)綀D形卡的速度更快朱巨,并且頂點著?器需要處理的次數(shù)也更少
OpenGL三?形環(huán)繞?式

-在默認(rèn)情況下叙甸,OpenGL認(rèn)為具有逆時針?向環(huán)繞的多邊形為正?颖医。

GL_CW: 順時針環(huán)繞的多邊形為正?
GL_CCW:逆時針環(huán)繞的多邊形為正?
// 手動指定那個面為正面,一般不做修改
glFrontFace(GL_CW);

矩陣堆棧

矩陣堆棧指的就是內(nèi)存中專門用來存放矩陣數(shù)據(jù)的某塊特殊區(qū)域裆蒸。
一般說來熔萧,矩陣堆棧常用于構(gòu)造具有繼承性的模型,即由一些簡單目標(biāo)構(gòu)成的復(fù)雜模型僚祷。矩陣堆棧對復(fù)雜模型運動過程中的多個變換操作之間的聯(lián)系與獨立十分有利佛致。

  • 堆棧的特點是先進(jìn)后出,堆棧的默認(rèn)深度是64
  • 默認(rèn)值為單元矩陣即與其相乘值并不會發(fā)生變化
初始化

modelViewMatrix.LoadIdentity();

壓棧

壓棧即為存儲一個狀態(tài)

//modelViewMatrix在初始化時辙谜,初始化了一個單元矩陣俺榆,此時的壓棧就是將棧頂?shù)木仃噺?fù)制一個,然后壓入棧頂
modelViewMatrix.PushMatrix()
矩陣相乘

當(dāng)前矩陣乘以棧頂矩陣,結(jié)果存儲到矩陣堆棧頂部

//我們使用棧頂?shù)膯卧仃嚺c觀察者矩陣相乘,此時得到的結(jié)果是觀察者矩陣装哆,并存放到棧頂阵难。
modelViewMatrix.MultMatrix(mCamera)

//然后再使用剛剛得到的觀察者矩陣與物體矩陣相乘导街,得到結(jié)果存放到棧頂。
modelViewMatrix.MultMatrix(mObjectFrame

出棧

出棧會將當(dāng)前棧頂矩陣推出,一般都是一個壓棧對應(yīng)一個出診,例如當(dāng)結(jié)束旋轉(zhuǎn)狀態(tài)時,需要恢復(fù)到之前狀態(tài)就進(jìn)行出棧操作

//出棧
modelViewMatrix.PopMatrix()
獲取棧頂?shù)木仃?/h5>
modelViewMatrix.GetMatrix()

案例分析

  • 本次鍵位操作圖形旋轉(zhuǎn)使用矩陣操作,每個頂點與旋轉(zhuǎn)矩陣相乘得到旋轉(zhuǎn)后的頂點坐標(biāo),不用像上個案例正方形移動一樣每操作一次自己計算一次坐標(biāo)
// 召喚場景
void RenderScene(void)
{
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
   
    //壓棧
    modelViewMatrix.PushMatrix();
    M3DMatrix44f mCamera;
    cameraFrame.GetCameraMatrix(mCamera);
    
    //矩陣乘以矩陣堆棧的頂部矩陣垫卤,相乘的結(jié)果隨后簡存儲在堆棧的頂部
    modelViewMatrix.MultMatrix(mCamera);
    
    M3DMatrix44f mObjectFrame;
    //只要使用 GetMatrix 函數(shù)就可以獲取矩陣堆棧頂部的值傲诵,這個函數(shù)可以進(jìn)行2次重載项滑。用來使用GLShaderManager 的使用卷扮∈倜幔或者是獲取頂部矩陣的頂點副本數(shù)據(jù)
    objectFrame.GetMatrix(mObjectFrame);
    
    //矩陣乘以矩陣堆棧的頂部矩陣,相乘的結(jié)果隨后簡存儲在堆棧的頂部
    modelViewMatrix.MultMatrix(mObjectFrame);
    
    /* GLShaderManager 中的Uniform 值——平面著色器
     參數(shù)1:平面著色器
     參數(shù)2:運行為幾何圖形變換指定一個 4 * 4變換矩陣
     --transformPipeline.GetModelViewProjectionMatrix() 獲取的
     GetMatrix函數(shù)就可以獲得矩陣堆棧頂部的值
     參數(shù)3:顏色值(黑色)
     */
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
    
    switch(nStep) {
        case 0:
            //設(shè)置點的大小
            glPointSize(4.0f);
            pointBatch.Draw();
            glPointSize(1.0f);
            break;
        case 1:
            //設(shè)置線的寬度
            glLineWidth(2.0f);
            lineBatch.Draw();
            glLineWidth(1.0f);
            break;
        case 2:
            glLineWidth(2.0f);
            lineStripBatch.Draw();
            glLineWidth(1.0f);
            break;
        case 3:
            glLineWidth(2.0f);
            lineLoopBatch.Draw();
            glLineWidth(1.0f);
            break;
        case 4:
            DrawWireFramedBatch(&triangleBatch);
            break;
        case 5:
            DrawWireFramedBatch(&triangleStripBatch);
            break;
        case 6:
            DrawWireFramedBatch(&triangleFanBatch);
            break;
    }
    
    //還原到以前的模型視圖矩陣(單位矩陣)
    modelViewMatrix.PopMatrix();
    
    // 進(jìn)行緩沖區(qū)交換
    glutSwapBuffers();
}

Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雏搂,一起剝皮案震驚了整個濱河市藕施,隨后出現(xiàn)的幾起案子寇损,更是在濱河造成了極大的恐慌,老刑警劉巖铅碍,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件润绵,死亡現(xiàn)場離奇詭異线椰,居然都是意外死亡胞谈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進(jìn)店門憨愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烦绳,“玉大人,你說我怎么就攤上這事配紫【睹埽” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵躺孝,是天一觀的道長享扔。 經(jīng)常有香客問我,道長植袍,這世上最難降的妖魔是什么惧眠? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮于个,結(jié)果婚禮上氛魁,老公的妹妹穿的比我還像新娘。我一直安慰自己厅篓,他們只是感情好秀存,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羽氮,像睡著了一般或链。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上档押,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天澳盐,我揣著相機(jī)與錄音,去河邊找鬼汇荐。 笑死洞就,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掀淘。 我是一名探鬼主播旬蟋,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼革娄!你這毒婦竟也來了倾贰?” 一聲冷哼從身側(cè)響起冕碟,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匆浙,沒想到半個月后安寺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡首尼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年挑庶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片软能。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡迎捺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出查排,到底是詐尸還是另有隱情凳枝,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布跋核,位于F島的核電站岖瑰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏砂代。R本人自食惡果不足惜蹋订,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泊藕。 院中可真熱鬧辅辩,春花似錦、人聲如沸娃圆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讼呢。三九已至撩鹿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悦屏,已是汗流浹背节沦。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留础爬,地道東北人甫贯。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像看蚜,于是被迫代替她去往敵國和親叫搁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361