准备工作
第一步,在main函数中初始化OpenGL并注册回调函数
//用来设置当前工作目录
gltSetWorkingDirectory(argv[0]);
//初始化GLUT库
glutInit(&argc, argv);
/*
初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指
双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区
*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//创建窗口大小
glutInitWindowSize(800, 600);
//设置窗口标题
glutCreateWindow("Triangle");
//注册重塑函数
glutReshapeFunc(changeSize);
//注册显示函数
glutDisplayFunc(RenderScene);
//注册特殊函数
glutSpecialFunc(SpecialKeys);
初始化正方形的数据
初始化正方形的数据,初始化只需要执行一次,因此这个方法在main函数中调用
setupRC()
{
//设置背景颜色
glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
//GLShaderManager shaderManager;
//初始化着色管理器
shaderManager.InitializeStockShaders();
//正方形的4个点坐标(x,y,z)
GLfloat vVerts[] = {
-0.3f,-0.3f,0.0f,
0.3f,-0.3f,0.0f,
0.3f,0.3f,0.0f,
-0.3f,0.3f,0.0f
};
//GLBatch triangleBatch;
//GLBatch是简单的批次容器,是GLTools的一个简单的容器类。
//连接方式为GL_TRIANGLE_FAN ,4个顶点
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
实现回调函数
//在窗口大小改变时触发
void changeSize(int w,int h)
{
glViewport(0, 0, w, h);
}
//特殊键位函数(上下左右)
void SpecialKeys(int key, int x, int y){
//xPos X轴的偏移
//yPos 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;
}
//通知重新渲染
glutPostRedisplay();
}
void RenderScene(void)
{
//2.设置一组浮点数来表示红色
//GLfloat vRed[] = {1.0,0.0,0.0,1.0f};
//传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
//shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交着色器
//triangleBatch.Draw();
//在开始的设置openGL 窗口的时候,我们指定要一个双缓冲区的渲染环境。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行。
//将后台缓冲区进行渲染,然后结束后交换给前台
//glutSwapBuffers();
//清除缓存区
/*
GL_COLOR_BUFFER_BIT :颜色缓冲区
GL_DEPTH_BUFFER_BIT :深度缓存区
GL_STENCIL_BUFFER_BIT:模板缓冲区
*/
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
//正方形颜色(R,G,B,A)
GLfloat vRed[] = {1.0f,0.0f,0.0f,0.0f};
//平移矩阵
M3DMatrix44f mTransfromMatrix;
m3dTranslationMatrix44(mTransfromMatrix, xPos, yPos, 0.0f);
//将矩阵结果 提交给固定着色器(平面着色器)中绘制
shaderManager.UseStockShader(GLT_SHADER_FLAT,mTransfromMatrix,vRed);
//绘制
triangleBatch.Draw();
//执行交换缓存区
glutSwapBuffers();
}