之前的創(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();
}
modelViewMatrix.GetMatrix()
// 召喚場景
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();
}