环境搭建以及需要引入包 参考:OpenGL环境搭建
引入相关资源
#include "GLShaderManager.h"
#include "GLTools.h"
#include <GLUT/GLUT.h>
具体作用:
GLShaderManager.h,引入了GLTool着色管理器,没有着色管理器,就不能在OpenGL(核心框架)着色。着色管理器不仅允许我们创建并管理着色器,还提供一组'存储着色器'他们能够进行一些基本渲染操作
GLTools.h 包含大部分GLTool中类似C语言的独立函数
GLUT/GLUT.h GLUT百科
要使用OpenGL和大多数工具一样,也需要进行一系列的初始化工作
1、gltSetWorkingDirectory(argv[0]); //设置当前工作目录
2、glutInit(&argc, argv); //初始化GLUT库
3、glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//初始化双缓冲窗口
其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指:双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区
--GLUT_DOUBLE:双缓存窗口,是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式,经常用来生成动画效果;
--GLUT_DEPTH:标志将一个深度缓存区分配为显示的一部分,因此能够执行深度测试;
--GLUT_STENCIL:确保有一个可用的模板缓存区。
4、glutInitWindowSize(800, 600); //设置显示窗口大小
5、glutCreateWindow("Square"); //窗口标题
6、注册一些callback函数,当对应的事件发生的时候,会自动调用到相应的函数中
GULT内部也运行着一个本地消息循环,拦截适当的消息(类型iOS中的Runloop);然后调用注册的相关回调函数
/*设定响应函数*/
glutReshapeFunc(changeSize); //调整窗口大小变化时的响应函数
glutDisplayFunc(RenderScene); //显示输出函数。主要是opengl的绘制
glutSpecialFunc(SpecialKeys); //注册特殊的键盘响应函数
7、
初始化一个GLEW库,确保OpenGL API对程序完全可用。
在试图做任何渲染之前,要检查确定驱动程序的初始化过程中没有任何问题
GLenumstatus =glewInit();
if(GLEW_OK!= status) {
printf("GLEW Error:%s\n",glewGetErrorString(status));
return1;
}
8、setupRC(); //设置渲染环境
9、glutMainLoop(); //进入循环,等待输入,触发相应的响应
设置渲染环境
void setupRC(){
glClearColor(0.98f, 0.40f, 0.7f, 1); //设置清屏颜色(背景颜色)
shaderManager.InitializeStockShaders();
没有着色器,在OpenGL 核心框架中是无法进行任何渲染的。初始化一个渲染管理器。
triangleBatch.Begin(GL_TRIANGLE_FAN, 4); //修改为GL_TRIANGLE_FAN ,4个顶点
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
接下来需要定义callback响应函数
1、调整窗口大小变化时的响应函数 changeSize
在changeSize中调用 glViewPort函数,作用:视口转化 ,将标准的设备坐标转换为当前屏幕坐标
2、显示输出函数。主要是opengl的绘制 RenderScene
1. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); //清除缓冲区
缓冲区是一块存在图像信息的储存空间,红色、绿色、蓝色和alpha分量通常一起分量通常一起作为颜色缓存区或像素缓存区引用。
OpenGL 中不止一种缓冲区(包括:颜色缓存区、深度缓存区和模板缓存区)
预置参数:
GL_COLOR_BUFFER_BIT :指示当前激活的用来进行颜色写入缓冲区 GL_DEPTH_BUFFER_BIT :指示深度缓存区 GL_STENCIL_BUFFER_BIT:指示模板缓冲区
2. GLfloat vRed[] = {1.0,0.0,0.0,1.0f}; //设置一组浮点数来表示颜色
3. shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed); //传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
4. triangleBatch.Draw(); //提交着色器
5.glutSwapBuffers(); //将后台缓冲区进行渲染,然后结束后交换给前台
在开始设置openGL 窗口的时候,我们指定要一个双缓冲区的渲染环境。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行。
3、特殊的键盘响应函数 SpecialKeys