zoukankan      html  css  js  c++  java
  • [译]GLUT教程

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Initialization

    这一节开始从main函数入手.第一步是线初始化GLUT库和创建窗体.

    GLUT进入事件处理循环之后会获得程序的控制权.GLUT会等待事件(event)发生,然后检查有没有绑定的函数来处理它.

    所以在GLUT进入它的事件处理循环之前,我们要先告诉GLUT事件发生时需要调用哪个函数来处理.

    你是不是想问什么是事件(event).事件就是诸如键盘的键被按下,鼠标被移动,窗体需要绘制(到显示器屏幕),还有窗体被改变大小,还有很多.. 我们先从处理绘制事件开始.

    告诉GLUT一个事件对应哪个函数的方法是注册回调函数(callback function).每一个事件类型GLUT都提供一个指定的函数来注册回调函数.

    main函数的框架如下:

    int main(int argc, char **argv)
    {
    
        // init GLUT and create window
    
        // register callbacks
    
        // enter GLUT event processing cycle
    
    }

    初始化GLUT和创建窗体

    所有GLUT函数都以glut开头(作为名字前缀),而GLUT的初始化函数都以glutInit开头.第一步是调用glutInit函数,原型如下:

    void glutInit(int *argc, char **argv);

    argc和argv都是只读的main函数传入变量的指针

    初始化GLUT之后,要定义窗体的属性.先定义位置,例如左上角在屏幕的位置.用glutInitWindowPosition函数实现,原型如下:

    void glutInitWindowPosition(int x, int y);

    x - 屏幕左边的像素值. -1表示使用默认值,意味着它交由window管理器来决定窗体出现在何处,不想这样的话就给正值,

    y - 屏幕顶部的像素值. 同上.

    接下来要定义窗体的大小,用glutInitWindowSize函数实现,原型如下:

    void glutInitWindowSize(int width, int height);

    width - 窗体的宽

    height - 窗体的高

    然后你要用glutInitDisplayMode函数定义显示模式,原型如下:

    void glutInitDisplayMode(unsigned int mode)

    mode - 指定显示模式

    参数mode是由GLUT库预定义的可选值组成的一个布尔组合(OR位模式),用来指定颜色模型和缓冲的数量和类型.

    预定义常量如下:

    GLUT_RGBA / GLUT_RGB - 选择RGBA窗体.这是默认选项.

    GLUT_INDEX - 选择颜色索引模式

    显示模式允许选择单缓冲或双缓冲的窗体,预定义常量如下:

    GLUT_SINGLE - 单缓存窗体

    GLUT_DOUBLE - 双缓冲窗体,需要支持平滑运动

    另外,你可以指定专用的缓冲集合

    GLUT_ACCUM - 堆缓冲

    GLUT_STENCIL - 模版缓冲

    GLUT_DEPTH - 深度缓冲

    假定你要创建一个RGB的双缓冲和深度缓冲的窗体.你要做的是用"或"合并这些常量.

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT DEPTH);

    完成了以上步骤之后,只需要调用glutCreateWindow来创建窗体,原型如下:

    int glutCreateWindow(char *title);

    title - 设置窗体标题

    返回值是窗体ID,该ID后面几章会用到.

    以下是上面零散初始化代码的整合:

    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    
    int main(int argc, char **argv) {
    
        // init GLUT and create Window
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowPosition(100,100);
        glutInitWindowSize(320,320);
        glutCreateWindow("Lighthouse3D- GLUT Tutorial");
    
        return 1;
    
    }

    注意到代码开头的include语法.包含的头文件是GLUT发行包,该发行包的位置在不同的操作系统都不同,所以跨平台检查是必须的.

    渲染函数和回调注册

    如果你运行这段代码,你会看到一个空的黑色命令行窗体,而不是OpenGL窗体.因为在渲染前还有两件事要做. 一是告诉GLUT库渲染的响应函数,该函数在每次窗体绘制或重绘的时候被GLUT调用.

    我们来创建一个渲染的例子函数.下面这函数将会清空颜色缓冲,然后画一个三角形.

    void renderScene(void) {
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glBegin(GL_TRIANGLES);
            glVertex3f(-0.5,-0.5,0.0);
            glVertex3f(0.5,0.0,0.0);
            glVertex3f(0.0,0.5,0.0);
        glEnd();
    
        glutSwapBuffers();
    }

    该函数的名字随你喜欢.现在你要做的是把它绑定到GLUT中.该绑定操作叫作注册一个回调.GLUT会在需要渲染的时候调用该函数.

    现在就告诉GLUT库renderScene函数需要在窗体绘制的时候调用.GLUT有一个专门函数来做绑定回调函数的操作,需要在窗体创建的时候调用,原型如下:

    void glutDisplayFunc(void (*funcName)(void));

    GLUT事件处理队列

    现在就剩下最后一步,就是告知GLUT可以开始获取事件处理队列.GLUT提供一个函数以死循环的方式持续等待下一个要处理的事件.原型如下:

    void glutMainLoop(void)

    所有步骤都给出了

    到目前的完整代码在下面.当你运行以下代码,会得到一个命令行窗体和一个简单的实例--白色三角形,应该是以指定的大小出现在指定的位置.

    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    
    void renderScene(void) {
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glBegin(GL_TRIANGLES);
            glVertex3f(-0.5,-0.5,0.0);
            glVertex3f(0.5,0.0,0.0);
            glVertex3f(0.0,0.5,0.0);
        glEnd();
    
            glutSwapBuffers();
    }
    
    int main(int argc, char **argv) {
    
        // init GLUT and create Window
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowPosition(100,100);
        glutInitWindowSize(320,320);
        glutCreateWindow("Lighthouse3D - GLUT Tutorial");
    
        // register callbacks
        glutDisplayFunc(renderScene);
    
        // enter GLUT event processing cycle
        glutMainLoop();
        
        return 1;
    }

  • 相关阅读:
    assert出问题了?
    UIWebView 禁止检测链接弹出UIActionSheet
    UIWebView 禁止检测链接弹出UIActionSheet
    Linux命令行下常用svn命令
    Linux命令行下常用svn命令
    续上文,Unity3D面试ABC
    续上文,Unity3D面试ABC
    部署 H3C CAS E0306
    部署 H3C CAS E0306
    H3C CAS 介绍 & 基本概念
  • 原文地址:https://www.cnblogs.com/live41/p/3368952.html
Copyright © 2011-2022 走看看