首先,我们需要搭建一个基本的窗口

1. 初始化glut模块
  1. glutInit(&argc, argv);

2. 加载配置模块
  1. 需要加载的有
  1. GLUT_DOUBLE 双缓冲窗口
  2. GLUT_RGBA RGBA颜色模式(后面尝试一下能否家在HSV颜色模式)
  3. GLUT_DEPTH 深度测试模块
  4. GLUT_STENCIL 模版缓冲区
    1. /**
    2. * GLUT_DOUBLE 双缓冲窗口 是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式经常用来生成动画效果
    3. * GLUT_RGBA RGBA颜色模式 RGBA通道,R G B A 的范围分别为 0-1
    4. * GLUT_DEPTH 深度测试 标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试
    5. * GLUT_STENCIL 模版缓冲区 确保有一个可用的模版缓冲区
    6. */
    7. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);

3.设置窗口大小 (后面的视口大小尽量与视图大小一致)
  1. glutInitWindowSize(600, 400);

4.给这个窗口取个名字并创建这个窗口
  1. glutCreateWindow("Triangle");

5.设置一个方法,用于捕获窗口改变时的消息
  1. /**
  2. * @param w 捕获到的宽度
  3. * @param h 捕获到的的高度
  4. */
  5. void ChangeSize(int w, int h)
  6. {
  7. }
  8. glutReshapeFunc(ChangeSize);

6.注册一个方法,用于设置显示的内容(屏幕刷新的时候)
  1. void RenderScene(void)
  2. {
  3. }
  4. glutDisplayFunc(RenderScene);

7.初始化GLEW库,并检查驱动初始化过程中是否出现问题,以确保OpenGL API是完整的,可用的
  1. GLenum status = glewInit();
  2. if (status != GLEW_OK) {
  3. printf("GLEW Occur an error: %s \n", glewGetErrorString(status));
  4. return 1;
  5. }

8.设置渲染环境(准备工作)
  1. void SetupRC()
  2. {
  3. }
  4. SetupRC();

9.加载并启动MainLoop配置
  1. glutMainLoop();

至此,基本窗口就搭建完毕了,接下来开始写窗口内的内容


接下来,配置一下窗口大小发生变化时的操作

  1. void ChangeSize(int w, int h)
  2. {
  3. glViewport(0, 0, w, h)
  4. }

当初始化窗口或拉动窗口边界改变窗口大小时,将窗口大小改变为初始化的大小或拉动到的大小,如果不设置这一步的话,


然后进行绘制的准备

  1. 设置画板的背景颜色

    1. //设置成了水蓝色
    2. glClearColor(212/255.0, 242/255.0, 231/255.0, 1);
  2. 创建一个全局的着色器,用来绘制图案,并初始化

    1. GLShaderManager shaderManager;
    2. shaderManager.InitializeStockShaders()
  3. 设置图形顶点数据

    1. GLfloat vTops[] = {
    2. -0.4, -0.3, 0,
    3. 0.6, -0.7, 0,
    4. 0.2, 0.5, 0
    5. };
  4. 创建一个全局容器,用来描绘路径

    1. GLBatch triangleBatch;
  5. 设置绘制方式与绘制顶点个数,并将顶点数据拷贝进容器内

    1. /**
    2. * GL_TRIANGLES 三角形
    3. */
    4. triangleBatch.Begin(GL_TRIANGLES, 3);
    5. triangleBatch.CopyVertexData3f(vTops);
  6. 发送准备结束的信号,进入绘图阶段

    1. triangleBatch.End();

最后开始画图

  1. 清空缓冲区(可能保留有之前的状态,需要清空)

    1. /**
    2. * GL_COLOR_BUFFER_BIT 颜色缓冲区
    3. * GL_DEPTH_BUFFER_BIT 深度缓冲区
    4. * GL_STENCIL_BUFFER_BIT 模版缓冲区
    5. */
    6. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
  2. 选中着色器(就像ps那样),并着色器的属性(主要是设置颜色)

    1. shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vPencil);
  3. 调用开始绘制的命令,并切换显示器的缓冲区(现在一般的显示器都是双缓冲区,在显示的时候会进行新的绘制,绘制完毕后会显示这次的绘制,并切换缓冲区并进行新的绘制)

    1. triangleBatch.Draw();
    2. glutSwapBuffers();
  4. 这个时候,三角形就出现在屏幕上啦 👏👏👏👏 Nice Job~

[demo1].来一个最简单的三角形吧 - 图1

Demo在这里