OpenGL-基本圖元繪制(案例分析)

案例效果先擺上Demo的github地址

案例效果圖

三大函數(shù)

1葛碧、ChangeSize函數(shù):主要是設(shè)置視口及投影方式冒萄,當(dāng)視口發(fā)生變化當(dāng)時(shí)候時(shí)會(huì)調(diào)用

案例中設(shè)置視口代碼示例:

glViewport(0, 0, w, h);

案例中設(shè)置投影方式代碼示例:

viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);

案例中完整代碼

// 使用窗口維度設(shè)置視口和投影矩陣.
void ChangeSize(int w, int h)
{
    glViewport(0, 0, w, h);
    //創(chuàng)建投影矩陣窖逗,并將它載入投影矩陣堆棧中
    viewFrustum.SetPerspective(35.0f, float(w) / float(h), 1.0f, 500.0f);
    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    
    //調(diào)用頂部載入單元矩陣
    modelViewMatrix.LoadIdentity();
}

2既琴、SetupRC函數(shù):初始化函數(shù)顷蟀,圖形數(shù)據(jù)配置丐膝,主要是頂點(diǎn)數(shù)據(jù)及圖元連接方式

// 此函數(shù)在呈現(xiàn)上下文中進(jìn)行任何必要的初始化捐友。.
// 這是第一次做任何與opengl相關(guān)的任務(wù)淫半。
void SetupRC()
{
    // 灰色的背景
    glClearColor(0.5f, 0.7f, 0.5f, 1.0f );
    shaderManager.InitializeStockShaders();
    glEnable(GL_DEPTH_TEST);
    //設(shè)置變換管線以使用兩個(gè)矩陣堆棧
    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
    cameraFrame.MoveForward(-15.0f);
    /*
     常見函數(shù):
     void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0);
      參數(shù)1:表示使用的圖元
      參數(shù)2:頂點(diǎn)數(shù)
      參數(shù)3:紋理坐標(biāo)(可選)
     
     //負(fù)責(zé)頂點(diǎn)坐標(biāo)
     void GLBatch::CopyVertexData3f(GLFloat *vNorms);
     
     //結(jié)束,表示已經(jīng)完成數(shù)據(jù)復(fù)制工作
     void GLBatch::End(void);
     
     */
    //定義一些點(diǎn)匣砖,三角形形狀科吭。
   
    GLfloat vCoast[9] = {
        3,3,0,0,3,0,3,0,0
    };
    //用點(diǎn)的形式
    pointBatch.Begin(GL_POINTS, 3);
    pointBatch.CopyVertexData3f(vCoast);
    pointBatch.End();
}

案例主要完成以下幾點(diǎn)內(nèi)容:
1、設(shè)置背景顏色
2猴鲫、初始化著色器
3对人、開啟深度測(cè)試開關(guān)
4、設(shè)置變換管線以使用兩個(gè)矩陣堆棧
5拂共、設(shè)置觀察者位置
6牺弄、頂點(diǎn)數(shù)據(jù)創(chuàng)建和傳輸

3、RenderScene函數(shù):主要用于圖形的繪制宜狐,可以系統(tǒng)觸發(fā)势告,也可以開發(fā)者手動(dòng)觸發(fā)蛇捌,工作流程如下:

渲染流程圖

示例代碼如下:

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é)果隨后簡(jiǎn)存儲(chǔ)在堆棧的頂部
    modelViewMatrix.MultMatrix(mCamera);
    
    M3DMatrix44f mObjectFrame;
    //只要使用 GetMatrix 函數(shù)就可以獲取矩陣堆棧頂部的值咱台,這個(gè)函數(shù)可以進(jìn)行2次重載络拌。用來使用GLShaderManager 的使用』啬纾或者是獲取頂部矩陣的頂點(diǎn)副本數(shù)據(jù)
    objectFrame.GetMatrix(mObjectFrame);
    
    //矩陣乘以矩陣堆棧的頂部矩陣春贸,相乘的結(jié)果隨后簡(jiǎn)存儲(chǔ)在堆棧的頂部
    modelViewMatrix.MultMatrix(mObjectFrame);
    
    /* GLShaderManager 中的Uniform 值——平面著色器
     參數(shù)1:平面著色器
     參數(shù)2:運(yùn)行為幾何圖形變換指定一個(gè) 4 * 4變換矩陣
     --transformPipeline.GetModelViewProjectionMatrix() 獲取的
     GetMatrix函數(shù)就可以獲得矩陣堆棧頂部的值
     參數(shù)3:顏色值(黑色)
     */
    shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);

    //設(shè)置點(diǎn)的大小
    glPointSize(4.0f);
    pointBatch.Draw();
    glPointSize(1.0f);

    //還原到以前的模型視圖矩陣(單位矩陣)
    modelViewMatrix.PopMatrix();
    
    // 進(jìn)行緩沖區(qū)交換
    glutSwapBuffers();
}

矩陣在堆棧中情況如下:


堆棧變化情況
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遗遵,隨后出現(xiàn)的幾起案子萍恕,更是在濱河造成了極大的恐慌,老刑警劉巖车要,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄坪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屯蹦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門绳姨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來登澜,“玉大人,你說我怎么就攤上這事飘庄∧匀洌” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵跪削,是天一觀的道長(zhǎng)谴仙。 經(jīng)常有香客問我,道長(zhǎng)碾盐,這世上最難降的妖魔是什么晃跺? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮毫玖,結(jié)果婚禮上掀虎,老公的妹妹穿的比我還像新娘。我一直安慰自己付枫,他們只是感情好烹玉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阐滩,像睡著了一般二打。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掂榔,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天继效,我揣著相機(jī)與錄音症杏,去河邊找鬼。 笑死莲趣,一個(gè)胖子當(dāng)著我的面吹牛鸳慈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播喧伞,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼走芋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了潘鲫?” 一聲冷哼從身側(cè)響起翁逞,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溉仑,沒想到半個(gè)月后挖函,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浊竟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年怨喘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片振定。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡必怜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出后频,到底是詐尸還是另有隱情梳庆,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布卑惜,位于F島的核電站膏执,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏露久。R本人自食惡果不足惜更米,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毫痕。 院中可真熱鬧壳快,春花似錦、人聲如沸镇草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯啤。三九已至竖伯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背七婴。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工祟偷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人打厘。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓修肠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親户盯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嵌施,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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