OpenGL学习(二)第一个程序

开发环境搭建好后,可以正式开始写代码了。

一.

OpenGL学习(二)第一个程序_第1张图片

图中或许是最简单的创建OpenGL窗口的代码了,因为很多非常有用的初始化工作还没做,不过这并不妨碍我们看到结果,如果一切编译正常通过的话,运行后你将看到一个小窗口(freeglut默认的大小是300x300),窗口的内容是无法预料的,或许是黑色,或许是屏幕内容。如果编译出错,那可能是开发环境没配置好。如果编译通过却看不到窗口,那你可能还要继续往下看!



二.

        相信接触过GUI编程的小伙伴对上面的几行代码很容易理解,初始化,创建窗口,主循环,没什么不懂的。接下来我们要给它增添几行代码,以使它能更好的按照我们的意图工作。

OpenGL学习(二)第一个程序_第2张图片

再次编译运行,我们可以看到一个大小为640x480大小的黑色窗口。

在main函数里,我们初始化显示模式为RGBA和双缓冲,大部分时候双缓冲(GLUT_DOUBLE)比单缓冲(GLUT_SINGLE)更好用,所以这里我们直接谈论双缓冲而不讨论单缓冲了。对于freeglut, 默认的显示模式是GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH,如果使用单缓冲,我们不必显式的调用glutInitDisplayMode。


三.

        值得一提的是,虽然这些代码仅30行,但是里面的坑却不少。

        首先,初始化窗口大小和位置的函数必须在创建窗口之前调用,否则不会起作用。上面的代码,如果把glutInitWindowSize和glutCreateWindow函数的位置互换,那么窗口的大小其实只有300x300(freeglut默认值), 而不是我们的680x480。

        其次,必须要显式的调用glClearColor设置背景颜色,因为glut没有默认的背景色。同时,渲染窗口的操作必须在创建窗口之后调用,如果把glutCreateWindow函数放在glutDisplayFunc函数之后,那么glutDisplayFunc没有任何效果,窗口背景不会被涂成黑色。

        再者,由于OpenGL是基于状态机的,所以render函数中,glClear清理操作不会被立刻执行,只有加上glutSwapBuffers函数,强制执行操作,所以的操作才会被真正执行。如果没有glutSwapBuffes,glClear无法使背景变为黑色。gl.h中有一个类似的函数glFlush, 这个函数是对于单缓冲模式而言的,对于双缓冲则没有效果。但glutSwapBuffers既可以用于双缓冲也可以用于单缓冲,因为glutSwapBuffers内部调用了glFlush。如果是单缓冲模式,glutSwapBuffers完全等同于glFlush,只有在双缓冲模式下,glutSwapBuffers除了执行glFlush外, 还会执行额外的操作。因此我建议无论何时最好使用glutSwapBuffers。


下一篇将介绍如何画基本的几何图形。


你可能感兴趣的:(OpenGL学习(二)第一个程序)