正方形的渲染
- 正方形的繪製,類似於三角形的繪製。基於三角形的繪製,只需要將繪製三角形的部分代碼修改,即可實現正方形的繪製;(三角形的繪製見我的上篇文章:OpenGL簡單渲染一個三角形)
- 定義正方形頂點到原點的距離,即正方形的邊長 = blockSize * 2;
// 圖形頂點到原點的距離
GLfloat blockSize = 0.1f;
// 設置正方形頂點,其中數組vVerts包含所有4個頂點的x,y,z笛卡爾座標對
GLfloat vVerts[] = {-blockSize, -blockSize, 0.0f,
blockSize, -blockSize, 0.0f,
blockSize, blockSize, 0.0f,
-blockSize, blockSize, 0.0f};
// 批次處理,將數據傳遞到着⾊色器器
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
- 至此,一個完整的正方形就繪製完成了。附上完整的正方形繪製代碼:
#include "GLShaderManager.h"
#include "GLTools.h"
#include <GLUT/GLUT.h>
// 着色器
GLShaderManager shadermanager;
// 批次容器
GLBatch triangleBatch;
// 正方形的邊長
GLfloat blockSize = 0.1f;
/// 窗口大小改變時接受新的寬度和高度
/// 觸發條件: 1.新建窗口 2.窗⼝尺⼨發生調整
/// 處理理業務: 1.設置OpenGL 視⼝ 2. 設置OpenGL 投影⽅式等
/// @param w 像素
/// @param h 像素
void changeWindowSize(int w, int h) {
glViewport(0, 0, w, h);
}
void setupRC() {
// 設置背景色
glClearColor(0.90f, 0.40f, 0.0f, 1.0f);
// 初始化着色器
shadermanager.InitializeStockShaders();
// 設置正方形頂點,其中數組vVerts包含所有4個頂點的x,y,z笛卡爾座標對
GLfloat vVerts[] = {-blockSize, -blockSize, 0.0f,
blockSize, -blockSize, 0.0f,
blockSize, blockSize, 0.0f,
-blockSize, blockSize, 0.0f};
// 批次處理,將數據傳遞到着⾊色器器
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
/// 開始渲染(觸發條件:1.系統自動觸發 2.⼿動調用函數觸發)
void renderScene(void) {
// 清除一個或一組特定的緩衝區
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// 設置一組浮點數來表示顏色
GLfloat colorRed[] = {1.0f, 0.0f, 0.0f, 1.0f};
// 傳遞到存儲着色器,即GLT_SHADER_IDENTITY着色器,這個着色器只是使用指定顏色以默認笛卡爾座標第在屏幕上渲染幾何圖形
shadermanager.UseStockShader(GLT_SHADER_IDENTITY, colorRed);
// 提交着色器
triangleBatch.Draw();
// 將在後臺緩衝區進行渲染,然後在結束時交換到前臺
glutSwapBuffers();
}
int main(int argc, char *argv[]) {
// 設置當前工作目錄,針對MAC OS X
gltSetWorkingDirectory(argv[0]);
// 初始化GLUT庫
glutInit(&argc, argv);
/* 初始化雙緩衝窗口
* GLUT_DOUBLE : 雙緩衝窗口
* GLUT_RGBA : RGBA顏色模式
* GLUT_DEPTH : 深度測試
* GLUT_STENCIL : 模板緩衝區
*/
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STENCIL);
// GLUT窗口大小,標題窗口
glutInitWindowSize(400, 400);
glutCreateWindow("正方形的移動");
// 註冊回掉函數
glutReshapeFunc(changeWindowSize);
glutDisplayFunc(renderScene);
// 驅動程序的初始化中沒有出現問題,確保API完全正常使用
GLenum statue = glewInit();
if (GLEW_OK != statue) {
fprintf(stderr,"glew error:%s\n",glewGetErrorString(statue));
return 1;
}
// 設置渲染環境
setupRC();
glutMainLoop();
return 0;
}