首先,我们需要搭建一个基本的窗口
1. 初始化glut模块
glutInit(&argc, argv);
2. 加载配置模块
需要加载的有
-
GLUT_DOUBLE 双缓冲窗口
-
GLUT_RGBA RGBA颜色模式(后面尝试一下能否家在HSV颜色模式)
-
GLUT_DEPTH 深度测试模块
-
GLUT_STENCIL 模版缓冲区
/** * GLUT_DOUBLE 双缓冲窗口 是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式经常用来生成动画效果 * GLUT_RGBA RGBA颜色模式 RGBA通道,R G B A 的范围分别为 0-1 * GLUT_DEPTH 深度测试 标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试 * GLUT_STENCIL 模版缓冲区 确保有一个可用的模版缓冲区 */ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
3.设置窗口大小 (后面的视口大小尽量与视图大小一致)
glutInitWindowSize(600, 400);
4.给这个窗口取个名字并创建这个窗口
glutCreateWindow("Triangle");
5.设置一个方法,用于捕获窗口改变时的消息
/**
* @param w 捕获到的宽度
* @param h 捕获到的的高度
*/
void ChangeSize(int w, int h)
{
}
glutReshapeFunc(ChangeSize);
6.注册一个方法,用于设置显示的内容(屏幕刷新的时候)
void RenderScene(void)
{
}
glutDisplayFunc(RenderScene);
7.初始化GLEW库,并检查驱动初始化过程中是否出现问题,以确保OpenGL API是完整的,可用的
GLenum status = glewInit();
if (status != GLEW_OK) {
printf("GLEW Occur an error: %s \n", glewGetErrorString(status));
return 1;
}
8.设置渲染环境(准备工作)
void SetupRC()
{
}
SetupRC();
9.加载并启动MainLoop配置
glutMainLoop();
至此,基本窗口就搭建完毕了,接下来开始写窗口内的内容
接下来,配置一下窗口大小发生变化时的操作
void ChangeSize(int w, int h)
{
glViewport(0, 0, w, h)
}
当初始化窗口或拉动窗口边界改变窗口大小时,将窗口大小改变为初始化的大小或拉动到的大小,如果不设置这一步的话,
然后进行绘制的准备
-
设置画板的背景颜色
//设置成了水蓝色 glClearColor(212/255.0, 242/255.0, 231/255.0, 1);
-
创建一个全局的着色器,用来绘制图案,并初始化
GLShaderManager shaderManager; shaderManager.InitializeStockShaders()
-
设置图形顶点数据
GLfloat vTops[] = { -0.4, -0.3, 0, 0.6, -0.7, 0, 0.2, 0.5, 0 };
-
创建一个全局容器,用来描绘路径
GLBatch triangleBatch;
-
设置绘制方式与绘制顶点个数,并将顶点数据拷贝进容器内
/** * GL_TRIANGLES 三角形 */ triangleBatch.Begin(GL_TRIANGLES, 3); triangleBatch.CopyVertexData3f(vTops);
-
发送准备结束的信号,进入绘图阶段
triangleBatch.End();
最后开始画图
-
清空缓冲区(可能保留有之前的状态,需要清空)
/** * 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 );
-
选中着色器(就像ps那样),并着色器的属性(主要是设置颜色)
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vPencil);
-
调用开始绘制的命令,并切换显示器的缓冲区(现在一般的显示器都是双缓冲区,在显示的时候会进行新的绘制,绘制完毕后会显示这次的绘制,并切换缓冲区并进行新的绘制)
triangleBatch.Draw(); glutSwapBuffers();
-
这个时候,三角形就出现在屏幕上啦 👏👏👏👏 Nice Job~
网友评论