OpenGL实例(1)-创建窗体
首先,这是在Ubuntu下运行的程序.下载opengl图形库花费了不少时间.在Windows上,你更应该先下载glut,然后解压出glut.h,glut.dll,glut32.dll放在相应的文件夹内,或者你保证他们每次和你写的opengl文件放在同一个位置。
我觉得学什么都要运用,否则太困难了,今天先写一个OpenGL入门级的小程序.
我们新建一个simple.c
#include <GL/glut.h>
#include <stdio.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
// glClearColor//清除颜色
glBegin(GL_POLYGON);
glVertex2f(-0.5,-0.5);
glVertex2f(-0.5,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,-0.5);
glEnd();
glFlush();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutCreateWindow("Hello,world!");
glutDisplayFunc(display);//glutDisplayFunc(void (*func)(void))
glutMainLoop();//导致程序进入一个事件
}
保存,紧接着我们在相应的目录下:
gcc -g simple.c -o simple -lglut -lGL
你会发现后面多了两个-l参数,他们正是opengl的核心.glut[OpenGL Utility Toolki]是一个适用于所有现代视窗系统的函数库,GL是OpenGl的基础
前提:你要安装opengl图形库.
然后我们这样
./simple
就是这样子,一开始我以为opengl和Turbo图形库没有太大的区别,稍后我会把自己的想法驳倒.
先初步讲一下这段程序的结构,它是以后大型opengl程序的基础,其中的内容也是比较多的.
1.一个main()函数,它负责初始化glut.
2.一个init()函数,它设置初始量.
3.一个显示回调函数display().
4.负责处理输入和窗口事件的其他回调函数.
这些是什么东西啊,说实在的,我现在也是不太理解,在我没找到它的乐趣之前,我只能通过这种方式推动自己的学习啊
还是具体看代码吧,我就说我知道的吧!莫见怪啊.
头文件<GL/glut.h>和下面连接的库遥相呼应,呵呵,其中glut.h中包含#include<GL/gl.h>和#include<GL/glu.h>这样子就把opengl的所有头文件包括进来了.gl是opengl核心库,它包含了所有必要的opengl函数;glu[OpenGL Utility Library]是OpenGL工具库,其中包含了用核心库的函数编写的扩展函数.核心库的函数名以gl开头,比如glClear(),而工具库以glu开头,比如...好吧,暂时没有.那么,以glut开头的函数你能想到什么呢?
还有,函数的命名真的很有特点.
void glutInit(int *char, char **argu)
负责初始化GLUT ,应在其他glut函数和OpenGL函数调用之前调用.它从主函数获取参数.
int glutCreateWindows(char *title)
负责创建一个窗口,并赋予其窗口标题,上面的例子就是hello,world.
glutDisplayFunc(void (*func)(void))
从字面上也能理解它是在回调一个名为func的函数.
void glutMainLoop()
它应该是main()函数的最后一个函数.
而整个display()函数就是在描绘一个矩形
void glClear(GL_COLOR_BUFFER_BIT)
还有
void glFlush()
是一对必不可少的语句,我不懂什么缓存,帧缓存,请注意他们的位置.
glBegin(GL_POLYGON) and glEnd()
是定义一个图元(opengl中有三类基本的几何图元:点(GL_POINTS),线段(GL_LINES)和多边形(GL_POLYGON))的起点和终点,也是成对出现的.
glVertex2f(-0.5,-0.5)的原型是
void glVertex{234}{sifd}(x轴,y轴...)
定义了顶点,允许你使用glVertex*()函数的各个变体定义二维还是三维的甚至更高的维度,sifd是类型了分别是short,int,float,double的缩写了。
相关阅读: