计算机图形学09一一OpenGL 显示列表

来源:互联网 发布:软件著作权的申请 编辑:程序博客网 时间:2024/05/17 01:57
显示表有什么作用呢?
把对象描述成一个命名的语句序列(或任何其他的命令集) 并存储起来既方便又高效。在OpenGL中使用称为显示表,一旦建立显示表, 就可以

用不同的显示操作来多次引用该表

显示表的函数

glNewList(listID,listMoade)

glEndList();


listID:       作为正整数的表名来形成一个显示表
listMoade:希望为以后执行而存储该表 用GL_COMPILE
      立即执行 GL_COMPILE_AND_EXECUTE 以后也可以引用


显示表创建后要立即对参数表示进行赋值计算 从而使表中存储参数的值 对这些参数后继修改都不起作用
显示表里面还可以嵌入显示表
如果一个显示表被赋予一个已经使用的标识 ,则它取代原来的显示表 这就将导致丢失
可以使用 glGenLists(GINT) 这个语句是将一个未使用的正整形给ListID
glGenLists(5) 的时候 他会创建5个连续未使用过的正整数 如果 4 已经被使用了他的值就会是 5 6 7 8 9 这样整数 没有被使用
glGenLists(3) 的时候 生成 1 2 3 然后返回第一个值 1 或者 5 这些都是没有被使用的这就避免 listID 被重复使用
当为0表示没有创建成功


glIsList(listID) 是用来判断这个ID 有没有被使用了


glCallList(listID) 执行显示表

使用下面2个语句可以执行多个显示表

glListBase(offestValue)

被执行的显示列表的索引是通过把当前显示列表的基址表示的偏移值与listIDArray指定的数组中的有符号整形值相加得到的。默认是0

glCallLists(nLists,arrayDataType,listIDArray)

nLists 要执行显示的个数

arrayDataType 用来数据的类型

listIDArray 包含任意多的元素 无效的标识会被忽略

删除表示

glDeleteLists(startID,nList)

比如 (5, 4) 删除 5 6 7 8 的表

代码

//显示表

void listShow(void)
{
const double TWO_IP = 6.2831853;


GLuint regHex;


GLdouble theta;


GLint x, y, k;


regHex = glGenLists(1);
glNewList(regHex, GL_COMPILE);
glBegin(GL_POLYGON);
for (k = 0; k < 6; k++)
{
//这边的意思是 2π / 360 * 角度  这个是角度转化弧度公式    
//2π / 360 * 角度(  k / 6.0 * 360) = 2π / 360  * 360 *  k / 6.0 = 2π *  k / 6.0
theta = TWO_IP * k / 6.0;
x = 20 + 15 * cos(theta);
y = 20 + 15 * sin(theta);
glVertex2i(x, y);
}
glEnd();
glEndList();


glCallList(regHex);


glFlush();
}

如图






0 0
原创粉丝点击