- glutInit 初始化GLUT库
- glutInitWindowPosition 设置窗口初始位置
- glutInitWindowSize 设置窗口初始大小
- glutInitDisplayMode 设置初始显示模式
- glutMainLoop 进入GLUT事件处理循环
1.glutInit 初始化GLUT库
void glutInit(int * argc, char * * argv)
参数说明: argc argv 对应int main(int argc,char* argv[])
该函数在一个主程序中只使用一次,一般直接复制粘贴就好,基本不变
2.glutInitWindowPosition 设置窗口初始位置
void glutInitWindowPosition(int x, int y)
参数说明:x,y 分别为窗口左上角的x,y坐标
3.glutInitWindowSize 设置窗口初始大小
void glutInitWindowSize(int width, int height)
参数说明:width, height分别为初始窗口的宽度与高度
glutInitWindowPosition 与 glutInitWindowSize 的目的都是向窗口系统建议窗口的初始参数,但窗口系统未必使用该信息.其中窗口的实际大小是通过形状变化回调函数确定的,即之后会提到的glutReshapeFunc
4.glutInitDisplayMode 设置初始显示模式
void glutInitDisplayMode(unsigned int mode)
参数说明: mode 指定初始窗口的显示模式,通常是若干指明窗口桢缓存特性的标识的组合.GLUT库定义了以下几种标识:
GLUT_RGBA RGBA模式窗口
GLUT_RGB GLUT_RGBA的别称
GLUT_INDEX 颜色索引模式窗口
若上述三种均未出现,则默认为RGBA模式,若均出现,则为INDEX模式
GLUT_SINGLE 指定为单缓存窗口
GLUT_DOUBLE 指定为双缓存窗口
若上述两种均未出现,则默认为SINGLE模式,若均出现,则默认为DOUBLE模式
GLUT_SINGLE,屏幕显示调用glFlush(),将图像在当前显示缓存中直接渲染,会有图形跳动(闪烁)问题
GLUT_DOUBLE,屏幕显示调用glutSwapBuffers(),将图像先绘制在另外的缓存中,渲染完毕之后,将其整个缓存贴到当前的窗口,能消除闪烁,一般动画要用双缓冲.
GLUT_ACCUM 窗口使用累加缓存
GLUT_ALPHA 窗口的颜色缓存包含alpha分量
GLUT_DEPTH 窗口使用深度缓存
GLUT_STENCIL 窗口使用模板缓存
GLUT_MULTISAMPLE 指定支持多样本功能的窗口
GLUT_STEREO 指定立体窗口
GLUT_LUMINANCE 使用亮度颜色模型,但大多数OpenGL平台都不支持该功能
各标识之间使用’|'分隔,例如,如果要创建单缓存的RGBA窗口,代码为glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE)
5.glutMainLoop 进入GLUT事件处理循环
void glutMainLoop(void)
调用该函数进入GLUT事件处理循环,在GLUT程序中最多只能调用一次,一旦被调用就不再返回 (因此一旦调用该函数,该函数之后的代码便不再执行),并且调用注册过的回调函数.
例如画一个绿色的三角形,并在调用glutMainLoop函数之后要求输出一行话:
#include <windows.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <stdio.h>
//画一个绿色的三角形
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,1,0);
//画一个三角形
glBegin(GL_LINE_LOOP);
glVertex2f(-0.5,0);
glVertex2f(0.5,0);
glVertex2f(0,0.5);
glEnd();
glFlush();
}
int main(int argc,char* * argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(300,300);
glutInitWindowPosition(200,200);
glutCreateWindow("triangle");
glutDisplayFunc(display);
glutMainLoop();
printf("exist");
return 0;
}
运行结果:
结果并未输出exist,这就证明了该函数一旦被调用就不再返回.