三角形渲染
OpenGL正方形渲染與移動(dòng)
渲染
-
將正方形頂點(diǎn)存儲(chǔ)在全局?jǐn)?shù)組
GLfloat vVerts[] = { -blockSize,-blockSize,0.0f, blockSize,-blockSize,0.0f, blockSize,blockSize,0.0f, -blockSize,blockSize,0.0f };
-
初始化
void setupRC() { //設(shè)置清屏顏色(背景顏色) glClearColor(0.98f, 0.40f, 0.7f, 1); shaderManager.InitializeStockShaders(); //修改為GL_TRIANGLE_FAN 鏈接方式,4個(gè)頂點(diǎn) triangleBatch.Begin(GL_TRIANGLE_FAN, 4); triangleBatch.CopyVertexData3f(vVerts); triangleBatch.End(); }
-
重塑函數(shù)(glutReshapeFunc回調(diào))
/* 在窗口大小改變時(shí),接收新的寬度&高度课幕。 */ void changeSize(int w,int h) { /* x,y 參數(shù)代表窗口中視圖的左下角坐標(biāo),而寬度座柱、高度是像素為表示,通常x,y 都是為0 */ glViewport(0, 0, w, h); }
-
渲染函數(shù)(glutDisplayFunc回調(diào))
void RenderScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); GLfloat vRed[] = {1.0,0.0,0.0,1.0f}; //傳遞到存儲(chǔ)著色器,即GLT_SHADER_IDENTITY著色器,這個(gè)著色器只是使 用指定顏色以默認(rèn)笛卡爾坐標(biāo)第在屏幕上渲染幾何圖形 shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed); //提交著色器 triangleBatch.Draw(); //在開(kāi)始的設(shè)置openGL 窗口的時(shí)候斋配,我們指定要一個(gè)雙緩沖區(qū)的渲染環(huán) 境。這就意味著將在后臺(tái)緩沖區(qū)進(jìn)行渲染孵稽,渲染結(jié)束后交換給前臺(tái)许起。這種方式可以防止觀察者看到可能伴隨著動(dòng)畫(huà)幀與動(dòng)畫(huà)幀之間的閃爍的渲染過(guò)程十偶。緩沖區(qū)交換平臺(tái)將以平臺(tái)特定的方式進(jìn)行菩鲜。 //將后臺(tái)緩沖區(qū)進(jìn)行渲染,然后結(jié)束后交換給前臺(tái) glutSwapBuffers(); }
監(jiān)聽(tīng)鍵盤(pán)函數(shù)
GLUT提供了另一個(gè)回調(diào)函數(shù)glutSpecialFunc惦积,監(jiān)聽(tīng)了特殊按鍵被調(diào)用的函數(shù)接校,例如功能鍵或方向鍵。
在Main函數(shù)中加入以下代碼,注冊(cè)SpecialKeys回調(diào)函數(shù)
glutSpecialFunc(SpecialKeys)
-
通過(guò)點(diǎn)更新坐標(biāo)的方式移動(dòng)正方形蛛勉,并增加碰撞檢測(cè)
triangleBatch.CopyVertexData3f(vVerts);
復(fù)制頂點(diǎn)數(shù)據(jù)更新批次位置鹿寻;glutPostRedisplay();
告知GLUT需要更新內(nèi)容void SpecialKeys(int key, int x, int y){ GLfloat stepSize = 0.025f; GLfloat blockX = vVerts[0]; GLfloat blockY = vVerts[10]; printf("v[0] = %f\n",blockX); printf("v[10] = %f\n",blockY); if (key == GLUT_KEY_UP) { blockY += stepSize; } if (key == GLUT_KEY_DOWN) { blockY -= stepSize; } if (key == GLUT_KEY_LEFT) { blockX -= stepSize; } if (key == GLUT_KEY_RIGHT) { blockX += stepSize; } //觸碰到邊界(4個(gè)邊界)的處理 //當(dāng)正方形移動(dòng)超過(guò)最左邊的時(shí)候 if (blockX < -1.0f) { blockX = -1.0f; } //當(dāng)正方形移動(dòng)到最右邊時(shí) //1.0 - blockSize * 2 = 總邊長(zhǎng) - 正方形的邊長(zhǎng) = 最左邊點(diǎn)的位置 if (blockX > (1.0 - blockSize * 2)) { blockX = 1.0f - blockSize * 2; } //當(dāng)正方形移動(dòng)到最下面時(shí) //-1.0 - blockSize * 2 = Y(負(fù)軸邊界) - 正方形邊長(zhǎng) = 最下面點(diǎn)的位置 if (blockY < -1.0f + blockSize * 2 ) { blockY = -1.0f + blockSize * 2; } //當(dāng)正方形移動(dòng)到最上面時(shí) if (blockY > 1.0f) { blockY = 1.0f; } printf("blockX = %f\n",blockX); printf("blockY = %f\n",blockY); // Recalculate vertex positions vVerts[0] = blockX; vVerts[1] = blockY - blockSize*2; printf("(%f,%f)\n",vVerts[0],vVerts[1]); vVerts[3] = blockX + blockSize*2; vVerts[4] = blockY - blockSize*2; printf("(%f,%f)\n",vVerts[3],vVerts[4]); vVerts[6] = blockX + blockSize*2; vVerts[7] = blockY; printf("(%f,%f)\n",vVerts[6],vVerts[7]); vVerts[9] = blockX; vVerts[10] = blockY; printf("(%f,%f)\n",vVerts[9],vVerts[10]); triangleBatch.CopyVertexData3f(vVerts); glutPostRedisplay(); }
-
通過(guò)矩陣更新坐標(biāo)的方式移動(dòng)正方形,并增加碰撞檢測(cè)
設(shè)置矩陣渲染
void RenderScene(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f}; M3DMatrix44f mFinalTransform,mTransfromMatrix,mRotationMartix; //平移 m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f); //每次平移時(shí)诽凌,旋轉(zhuǎn)5度 static float yRot = 0.0f; yRot += 5.0f; m3dRotationMatrix44(mRotationMartix, m3dDegToRad(yRot), 0.0f, 0.0f, 1.0f); //將旋轉(zhuǎn)和移動(dòng)的矩陣結(jié)果 合并到mFinalTransform (矩陣相乘) m3dMatrixMultiply44(mFinalTransform, mTransfromMatrix, mRotationMartix); //將矩陣結(jié)果 提交給固定著色器(平面著色器)中繪制 shaderManager.UseStockShader(GLT_SHADER_FLAT,mFinalTransform,vRed); triangleBatch.Draw(); //執(zhí)行交換緩存區(qū) glutSwapBuffers(); }
更新x與y坐標(biāo)移動(dòng)
void SpecialKeys(int key, int x, int y){ GLfloat stepSize = 0.025f; if (key == GLUT_KEY_UP) { yPos += stepSize; } if (key == GLUT_KEY_DOWN) { yPos -= stepSize; } if (key == GLUT_KEY_LEFT) { xPos -= stepSize; } if (key == GLUT_KEY_RIGHT) { xPos += stepSize; } //碰撞檢測(cè) if (xPos < (-1.0f + blockSize)) { xPos = -1.0f + blockSize; } if (xPos > (1.0f - blockSize)) { xPos = 1.0f - blockSize; } if (yPos < (-1.0f + blockSize)) { yPos = -1.0f + blockSize; } if (yPos > (1.0f - blockSize)) { yPos = 1.0f - blockSize; } glutPostRedisplay(); }