OpenGL学习(二)第一个程序
2014-10-22 00:00
92 查看
开发环境搭建好后,可以正式开始写代码了。
一.
图中或许是最简单的创建OpenGL窗口的代码了,因为很多非常有用的初始化工作还没做,不过这并不妨碍我们看到结果,如果一切编译正常通过的话,运行后你将看到一个小窗口(freeglut默认的大小是300x300),窗口的内容是无法预料的,或许是黑色,或许是屏幕内容。如果编译出错,那可能是开发环境没配置好。如果编译通过却看不到窗口,那你可能还要继续往下看!
二.
相信接触过GUI编程的小伙伴对上面的几行代码很容易理解,初始化,创建窗口,主循环,没什么不懂的。接下来我们要给它增添几行代码,以使它能更好的按照我们的意图工作。
再次编译运行,我们可以看到一个大小为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窗口的代码了,因为很多非常有用的初始化工作还没做,不过这并不妨碍我们看到结果,如果一切编译正常通过的话,运行后你将看到一个小窗口(freeglut默认的大小是300x300),窗口的内容是无法预料的,或许是黑色,或许是屏幕内容。如果编译出错,那可能是开发环境没配置好。如果编译通过却看不到窗口,那你可能还要继续往下看!
二.
相信接触过GUI编程的小伙伴对上面的几行代码很容易理解,初始化,创建窗口,主循环,没什么不懂的。接下来我们要给它增添几行代码,以使它能更好的按照我们的意图工作。
再次编译运行,我们可以看到一个大小为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 超级宝典第五版学习 第一个程序
- openGL 学习1--ubuntu中安装openGL与第一个绘图程序
- OpenGL入门学习之一——编写第一个OpenGL程序
- OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解
- OpenGL入门学习——第一课 编写第一个OpenGL程序
- [OpenGL学习] mac上运行第一个openGL程序
- OpenGL学习——第二课:第一个OpenGL程序
- OpenGL学习笔记一。第一个程序
- 学习OpenGL超级宝典(OpenGL superbible)的第一个程序
- SWING控件学习1:第一个SWING程序
- 第一个opengl程序完整攻略
- Java学习第一步:环境配置与编译第一个程序
- ruby 学习_1 --第一个ruby程序,hello world
- C++初学篇学习笔记一(上机调试第一个程序)
- WCF学习----我的第一个WCF程序
- papervision3d学习笔记:第一个程序
- 从零学习freemarker(1)老紫竹的第一个freemaker程序
- 开始学习python了,第一个程序是一个逆波兰式的表达式分析器
- GTK学习第一步: Windows环境下运行第一个GTK程序
- c#学习step by step---------第一个c#程序