(三)OpenGL初始化和启动事件处理

  1. glutInit 初始化GLUT库
  2. glutInitWindowPosition 设置窗口初始位置
  3. glutInitWindowSize 设置窗口初始大小
  4. glutInitDisplayMode 设置初始显示模式
  5. 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,这就证明了该函数一旦被调用就不再返回.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值