显示表
显示表的作用是将一组图形组合起来形成一个整体的对象。这样存储起来方便,而且绘图的时候也更高效。这对于层次式建模很有帮助。
在代码所给函数之外,还有
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();
}