@cxm-2016
2016-11-04T13:52:13.000000Z
字数 1253
阅读 2042
OpenGL
版本:1
作者:陈小默
声明:禁止商业,禁止转载
把一系列命令保存起来称为一个对象可以在以后方便的使用它们。为了做到这点,在OpenGL中提供一种叫做显示表(display list)的结构。一旦建立了显示表,就可以用不同额显示操作来多次引用该表。在网格中,描述图形的显示表存放在服务器中,以避免每次显示场景时都要传送表中的命令。
glNewList(listID,listMode);
.
.
.
glEndList();
关于函数的详细可以查阅OpenGL 相关API函数大全
显示列表床架和,立即对包括如坐标位置和颜色分量等参数的表示进行赋值运算,从而使表中仅仅存储参数的值。对这些参数的任何猴急修改都不起作用。因为不能修改显示表的值,所以在显示表中不能包含如顶点表指针等OpenGL命令。
我们可以创建任意多的显示表并通过一个标识来执行特定的显示表。一个显示表还可以嵌套在另一个显示表内。但一个显示表如果被赋予一个已经被使用的标识,则覆盖原来的显示表的内容。因此,为了避免不小心重用了标识造成的显示表的丢失,可以让OpenGL为我们自动生成标识。
GLuint listID = glGenLists(1);
尽管我们可以使用上述方法生成未使用过的标识,但是我们还可以用如下方法向系统插叙指定整数是否已经用作显示表的名字。
glIsList(listID);
用下面的语句可执行一个显示表:
glCallList(listID);
下面的程序用于创建并执行一个显示表。我们现在xy平面上创建一个以(200,200)为中心坐标,半径为150的圆周上六个等距离的顶点描述的规则六边形的显示表。然后调用显示表来显示该六边形。
const double PI = 3.14;
const double TWO_PI = 2*PI;
GLuint regHex;
GLdouble theta;
GLint x,y;
int main(int argc, const char * argv[]) {
regHex = glGenLists(1);
glNewList(regHex,GL_COMPILE);
glBegin(GL_POLYGON);
for(int i=0;i<6;i++){
theta = TWO_PI * i / 6.0;
x = 200 + 150 * cos(theta);
y = 200 + 150 * sin(theta);
glVertex2i(x,y);
};
glEnd();
glEndList();
glCallList(regHex);
return 0;
}
使用下列两条语句可以执行多个显示表。
glListBase(offsetValue);
glCallLists(nLists,arrayDataType,listIDArray);
要删除连续的一组显示表,可调用函数
glDeleteLists(startID,nLists);