哈哈, 千呼万唤始出来, 我们第二篇笔记新鲜出炉了( 话说不是没隔多久么。。。。)
呵呵, 闲话不多说, 我们来看看上一篇我们写的代码, 知其然也要知其所以然啊
#include <gl/glut.h> void display() { glClear( GL_COLOR_BUFFER_BIT); glRectf( -1, -1, 1, 1); glFinish(); } int main( int argc, char* argv[]) { glutInit( &argc, argv); glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition( 0, 0); glutInitWindowSize( 1280, 720); glutCreateWindow( "这个应该是标题吧"); glutDisplayFunc( &display); glutMainLoop(); return 0; }
先从头文件说起吧, 正规的OpenGL在使用的时候会包含
#include <GL/gl.h> #include <GL/glu.h>
这两个头文件, 但是小伙伴们还记得刚刚我们使用的glut库吗?在glut库里面直接就给我们包含了这两个头文件, 所以我们只需要包含glut.h就好了。
对于一个C语言程序, 我们首先会看他的主函数对吧, 我们现在就依次看看每句代码表示了什么:
glutInit( &argc, argv);
初始化, 一般就是这样写了
glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE);
设置显示的方式, 参数
值 |
对应宏定义 |
意义 |
GLUT_RGB |
0x0000 |
指定 RGB 颜色模式的窗口 |
GLUT_RGBA |
0x0000 |
指定 RGBA 颜色模式的窗口 |
GLUT_INDEX |
0x0001 |
指定颜色索引模式的窗口 |
GLUT_SINGLE |
0x0000 |
指定单缓存窗口 |
GLUT_DOUBLE |
0x0002 |
指定双缓存窗口 |
GLUT_ACCUM |
0x0004 |
窗口使用累加缓存 |
GLUT_ALPHA |
0x0008 |
窗口的颜色分量包含 alpha 值 |
GLUT_DEPTH |
0x0010 |
窗口使用深度缓存 |
GLUT_STENCIL |
0x0020 |
窗口使用模板缓存 |
GLUT_MULTISAMPLE |
0x0080 |
指定支持多样本功能的窗口 |
GLUT_STEREO |
0x0100 |
指定立体窗口 |
GLUT_LUMINANCE |
0x0200 |
窗口使用亮度颜色模型 |
glutInitWindowPosition( 0, 0);
设置窗口在屏幕的什么位置, 屏幕左上角为坐标原点http://write.blog.csdn.net/postedit
glutInitWindowSize( 1280, 720);
设置窗口大小
glutCreateWindow( "这个应该是标题吧");
根据前面的信息创建一个窗口, 传入的参数是窗口的名称(注意, 现在创建好的窗口不会显示出来, 只有在使用了glutMainLoop()之后才会显示到屏幕上)
glutDisplayFunc( &display);
注册一个绘图函数, 当我们需要绘图时就调用这个函数
glutMainLoop();
进入glut事件处理循环, 让所有与事件有关的函数无限循环
glClear( GL_COLOR_BUFFER_BIT);
清除, 这里是清除颜色
GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲
GL_DEPTH_BUFFER_BIT: 深度缓冲
GL_ACCUM_BUFFER_BIT: 累积缓冲
GL_STENCIL_BUFFER_BIT: 模板缓冲
glRectf( -1, -1, 1, 1);
绘制一个矩形, 四个参数表示位于对角线上两个点的横纵坐标, 默认坐标在-1到1之间, 当然, 我们后面可以修改他
glFinish();
向图形硬件提交缓冲区里的指令,并等待所有指令执行完成后再返回(说的通俗点就是让openGL的命令立即执行, 不会在缓冲区等待等待)。
小伙伴们看了注释是不是觉得OpenGL也不是想象中的那么难吧, 哦, 对了, 还有一个忘了说了, 以glut开头的都是glut库提供的函数, 以gl开头的都是标准的openGL函数, 小伙伴们都清楚了么。
每天积累一点点, 总有一天你会成为大神的