显示表

显示表的作用是将一组图形组合起来形成一个整体的对象。这样存储起来方便,而且绘图的时候也更高效。这对于层次式建模很有帮助。

在代码所给函数之外,还有

glIsList(listID);

结果返回GL_TRUE 或 GL_FALSE,表明该数字是否已作为显示表的标识

#include<Windows.h>
#include<GL/glut.h>
#include<cmath>
const double PI = acos(-1.0);

GLuint regHex;
GLdouble theta;
GLint x, y, k;

void setupList()
{
    /*
    *找到range个连续的未使用的标识,将第一个返回
    *@param range    需要多少个标识
    *@return        返回第一个
    */
    regHex = glGenLists(1);

    //以regHex作为表名形成显示表
    //生成但不立即执行
    glNewList(regHex, GL_COMPILE);
    {
        glBegin(GL_POLYGON);
        {
            for (k = 0; k < 6; ++k)
            {
                theta = PI * k / 3.0;
                x = 200 + 150 * cos(theta);
                y = 200 + 150 * sin(theta);
                glVertex2i(x, y);
            }
        }
        glEnd();
    }
    glEndList();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(1.0, 0.0, 0.0);

    //打印显示表
    glCallList(regHex);
    glFlush();
}

void displaySome()
{
    static int lists[] = { regHex };
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3d(1.0, 0.0, 0.0);

    //设定初始元素的偏移量,lists[0] + offset
    glListBase(0);

    /*
    *连续执行多个显示表
    *@param n        执行的显示表数量
    *@param type    数据类型
    *@param lists    显示表
    */
    glCallLists(1, GL_INT, lists);
    glFlush();
}

void deleteList()
{
    //删除从1开始,长度为1的显示表
    //更应该写成regHex, 1
    glDeleteLists(1, 1);
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("glList");
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 800.0, 0.0, 600.0);
    setupList();
    glutDisplayFunc(displaySome);
    glutMainLoop();
}