OpenGL显示列表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, {0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff},//Z };
box = glGenLists(1); // 申请一个显示表空间
glNewList(box,GL_COMPILE); // 开始创建box显示表
glBegin(GL_QUADS);
// 外面一个较大的正方体
// 上表面
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f( 1.0f, -1.0f, -1.0f);
glCallList(box);
// 调用显示表绘制出一个正方体
glPopMatrix();
}
angle++;
distance = 3.0f+sin(angle*3.14f/180.0f);
glFlush();
// 刷新GL命令队列
(3)删除显示表,在做退出前扫尾工作 glDeleteLists(box, 1); // 删除显示表
glNewList(fontOffset + j, GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]); glEndList(); } glNewList(fontOffset + ' ', GL_COMPILE); glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, text); glEndList(); } void printString(char *s) { glPushAttrib (GL_LIST_BIT); glListBase(fontOffset); glCallLists((GLsizei) strlen(s), GL_UNSIGNED_BYTE, (GLubyte *) s); glPopAttrib (); } void init() { glShadeModel(GL_FLAT); makeRasterFont(); } ///////////draw//////// glRasterPos2d(400,460); printString("WRITTEN BY YYB");//
for(int z=0; z<5; ++z) // Z方向上循环
{ glPushMatrix();
glColor4f(x/5.0f, y/5.0f, z/5.0f, 0.3f);
// 设置颜色
glTranslatef((x-2.0f)*distance, (y-2.0f)*distance, (z-2.0f)*distance);
glRotatef(angle/1.2f, 0.0f, 1.0f, 0.0f); // 绕Y轴旋转
glRotatef(angle/1.4f, 0.0f, 0.0f, 1.0f); // 绕Z轴旋转
Байду номын сангаас
for(int x=0; x<5; ++x) // X方向上循环
for(int y=0; y<5; ++y) // Y方向上循环
得到立方体阵列缩放的动画效果。 首先调用glGenLists()创建空显示表,并返回该显示表的数字名称(一个整数索引值) 给变量box。对于显示表,其数字名称是唯一的,不同的显示表必须有不同数字名称。 glGenLists()可以同时创建的多个连续的数字名称。比如box = glGenLists(2),执行 后将产生两个新的数字名称,其中box指向第一个数字名称,而box+1为第二个数字名称。
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f(-1.0f, -1.0f, 1.0f);
...
glEnd();
glEndList();
(2)在绘图函数中调用显示列表。
glTranslatef(0.0f, 0.0f,-50.0f); // 移入屏幕50.0f
glRotatef(angle/1.0f, 1.0f, 0.0f, 0.0f); // 绕X轴旋转
GLuint fontOffset; void makeRasterFont(void) {
GLuint i, j; glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
fontOffset = glGenLists(128); for (i = 0,j = 'A'; i < 26; i++,j++) {
实例二:显示位图字符(大写)
GLubyte text[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};//space 空格 GLubyte letters[][13] = {
{0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c,0x18},//letterA {0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff}, {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3}, {0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e}, {0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06}, {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3}, {0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0}, {0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3}, {0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3}, {0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e}, {0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe}, {0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c}, {0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe},
id = glGenLists(1) glNewList(id, GL_COMPILE) ...//(OpenGL函数) glEndList() (2)调用显示表 glCallList(id); // 调用显示表绘制图形 其前可以设置几何变换等操作。 (3)删除显示表
在退出程序前必须将所建立的显示表删除,释放显示表占用的资源。glDeleteLists(GLuint list, GLsizei range)用来删除用户建立的显示表:参数list表示要删除的第一个显示表的数字名 称;参数range表示从指定的第一个显示表开始要删除的显示表个数。本节中只有一个显示表,所 以range=1。如果建立了多个显示表,则可设置range的值来一次性删除多个显示表。比如有box0、 box1、box2、box3四个连续分配的显示表,则glDeleteLists(box1,3)将把显示表box1、box2、box3 删除,box0未被删除。
OpenGL 显示列表
在即时模式(Immediate Mode)下绘图,OpenGL函数被直接送进绘图流水线,相应的 图形对象被立即绘制出来。当需要在程序中多次绘制同一个复杂的图形时,这种绘制方 式会耗费大量的资源,从而降低程序的运行效率,为此OpenGL提供了更快速更有效的方 式---显示列表。 1.1 建立显示表、调用显示表、删除显示表 (1)建立显示表的代码框架如下:
glDeleteLists(id, 1); // 删除显示表
1.2 示例如下:绘制正方体阵列 (1)在初始化函数中建立显示列表 GLuint box; // 显示表的数字名称 GLfloat distance=3.0f; // 每个相邻正方体之间距离 GLfloat angle; // 立方体阵列的旋转角度中心的距离,改变distance的值就可以