学习OpenGL(glut)开发日志一--学会绘制第一个窗口(By Ivan小黄)


Data:2018/09/10
---------------

DAY_01:
-------
参考文章:https://blog.csdn.net/xie_zi/article/details/1911452
感谢博主!

// 这是完成测试的第一个Demo代码,下面我将给出一字一句的解释
#include <GL\freeglut.h>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓冲池
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一个OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

1.

/**首先应先建立一个main函数,这个main函数将完成必须的初始化和开启事件处理循环
*所有的GLUT函数都有glut前缀并且那些完成一些初始化的函数有glutInit前缀。
*你首先要做的是调用函数glutInit()。
*函数原型:
void glutInit(int argc, char ** argv)
*@param Argc 一个指针, 指向从main函数传递过来的没更改的argc变量
*@param Argv 一个指针, 指向从main函数传递过来的没更改的argv变量
*/

2.

/**接下来。你应该使用函数glutInitDisplayMode()定义显示方式。
*Void glutInitDisplayMode(unsighed int mode)
*参数:
*Mode――可以指定下列显示模式
*Mode参数是一个GLUT库里预定义的可能的布尔组合。你使用mode去指定颜色模式,数量和缓冲区类型。
*指定颜色模式的预定义常量有:

*1:GLUT_RGBA或者GLUT_RGB。指定一个RGBA窗口,这是一个默认的颜色模式。
*2:GLUT_INDEX。指定颜色索引模式。
*这个显示模式还允许你选择单缓冲区或双缓冲区窗口。

*1:GLUT_SINGLE.单缓冲区窗口。
*2:GLUT_BUFFER.双缓冲区窗口,这是产生流畅动画必须选的。

*还可以指定更多,如果你想指定一组特殊的缓冲的话,用下面的变量:
*1:GLUT_ACCUM.累积缓冲区。
*2:GLUT_STENCIL.模板缓冲区。
*3:GLUT_DEPTH.深度缓冲区。
*假定你想要一个有单缓冲区,深度缓冲区的RGB窗口,你用“或“(|)操作符来建立你想要的显示模式。
例:
*glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE|GLUT|DEPTH);
*
*
*/

3.

/**在初始化glut后, 我们开始定义我们的窗口位置(默认是屏幕左上角)
*我们使用glutInitWindowPosition();
*
* void glutInitWindowPosition(int x, int y);
*参数@param:
*X: 距离屏幕左边的像素数。-1是默认值,意思就是由窗口管理程序决定窗口出现在哪里。
*如果不使用默认值,那你就自己设置一个值。

*Y:距离屏幕上边的像素数。和X一样
*/

4.

/**
*注意,参数仅仅是对窗口管理程序的一个建议。尽管你精心的设置了窗口位置,window返回的可能是不同的位置。
*如果你设置了,一般会得到你想要的结果。接下来我们设置窗口大小,使用函数glutInitWindowSize()。
*
*Void glutInitWindowSize(int width,int height);
*
*参数@param:
*Width:窗口的宽度。
*Height:窗口的高度。
*
*/

5.

/**经过上面的这些步骤后,就可以调用函数glutCreateWindow()来创建窗口了。
Int glutCreateWindow(char title);
*参数:
*Title:设置窗口的标题。
*glutCreateWindow()的返回值是一个窗口标识符
*
*/

6.

/**void glutDisplayFunc(void (*func)(void));
*参数:
*
*func: 当窗口需要被重绘是调用的函数的名称。注意使用NULL作为实参是错误的。
*/

7.

/**
*最后一件事是告诉GLUT我们准备进入应用程序事件处理循环。GLUT提供了一个函数让程序进 入一个永不结束的循环。一直等待处理下一个事件。函数是glutMainLoop()。
*
*void glutMainLoop(void)
*
*/

8. –(关于myDisplay函数)

/*上面的函数的名字你可以自己取一个。现在你必须告诉GLUT使用我们上面的函数来进行渲 染。这个叫寄存回调。。让我们告诉GLUT这个函数myDisplay应该被使用。当需要重画的时候GLUT有一个只传递一个函数名称参数的函数(以函数名为形参的函数)就会被调用。

见6.函数原型void glutDisplayFunc(void (*func)(void));

8.1 glClear(…)

比较复杂,可以先了解一下
函数原型:

  void glClear(GLbitfield mask);

参数说明:

  GLbitfield:可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,颜色缓冲以及深度缓冲,可以使用以下标志位

      GL_COLOR_BUFFER_BIT:    当前可写的颜色缓冲
      GL_DEPTH_BUFFER_BIT:    深度缓冲
      GL_ACCUM_BUFFER_BIT:   累积缓冲
  GL_STENCIL_BUFFER_BIT: 模板缓冲

函数说明:

  glClear()函数的作用是用当前缓冲区清除值,也就是glClearColor或者glClearDepth、glClearIndex、glClearStencil、glClearAccum等函数所指定的值来清除指定的缓冲区,也可以使用glDrawBuffer一次清除多个颜色缓存。比如:

  glClearColor(0.0,0.0,0.0,0.0);

  glClear(GL_COLOR_BUFFER_BIT);

  第一条语句表示清除颜色设为黑色,第二条语句表示实际完成了把整个窗口清除为黑色的任务,glClear()的唯一参数表示需要被清除的缓冲区。

  像素检验、裁剪检验、抖动和缓存的写屏蔽都会影响glClear的操作,其中,裁剪范围限制了清除的区域,而glClear命令还会忽略alpha函数、融合函数、逻辑操作、模板、纹理映射和z缓存;

8.2 glRectf(…)

glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //绘制矩形

8.3 glFlush(…)

这个也需要慢慢理解,初学者,慢慢来嘛~

glFlush()清空缓冲区,将指令送往缓硬件立即执行,但是它是将命令传送完毕之后立即返回,不会等待指令执行完毕。这些指令会在有限时间内执行完毕。

如果直接绘制到前缓冲,那么OpenGL的绘制将不会有任何延迟。设想有一个复杂的场景,有很多物体需要绘制。当调用glFlush时,物体会一个一个地出现在屏幕上。但是,如果使用双缓冲,这个函数将不会有什么影响,因为直到交换缓冲区的时候变化才显现出来。

结语

第一次写博客,没啥经验,不过好在平时也经常看~哈哈,感觉挺好,随心所欲的编排~
希望能够帮到那些初学OpenGL的人吧!
好啦, 睡觉啦!
晚安!
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_19927141/article/details/82597999