显示列表可以提高性能,因为他可以存储OPENGL的函数,供以后使用,如果需要多次重绘同一个几何图形,或者如果一次需要多次调用的用于更改状态的函数,把这些函数存储在显示列表中(将显示列表中的矩阵结果集保存,后续使用不需要重复计算以提高性能) 当通过网络在另外一台远程计算机上运算OPENGL程序时,把绘画命令保存在显示列表中具有特别重要意义,由于显示列表是服务器的一部分,这样可以减少网络通信,提高性能 显示列表更像是命令缓存器,而不是动态数据库,也就是说当显示列表创建后,就无法修改。同时显示列表的创建也存在一定的系统开销,因此一个小的显示列表未必会提升性能 |
命名和创建,执行显示列表 |
1.申请索引值 Gluint listName = glGenLists (Glsizei range); 分配range个连续的,以前未分配的显示列表索引,返回值为连续索引的起始 2.指定显示列表的开始 glNewList (listName, mode); mode:GL_COMPILE GL_COMPILE_AND_EXECUTE 3.OPENGL指令 4.显示列表定义结束 glEndList (); 5.执行显示列表 glCallList (listName); |
层次式显示列表 可以创建层次式显示列表,这是一种在glNewList()与glEndList()之间调用glCallList()执行其他显示列表的显示列表 glNewList (listName, mode); glCallList (name1); glCallList (name2); glCallList (name3); glCallList (name4); glEndList (); 显示层次最少的嵌套层次是64,可能更高,通过GL_MAX_LIST_NESTING 属性查询 |
管理显示列表索引 Glboolean glIsList(Gluint list) void glDeleteLists(Gluint listm,Glsizei range) |
执行多个显示列表 glListBase(base); 指定一个偏移量,它将与glCallLists()函数中的显示列表索引值想加,以获取最终的显示列表索引,显示列表基址对于glCallList(),glNewList()无任何效果 glCallLists (GLsizei n, GLenum type, const GLvoid *lists); 执行n个显示列表 type:GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_2_BYTES GL_3_BYTES GL_4_BYTES 举例: base = glGenLists (128); glListBase(base); glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList(); glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList(); glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList(); char *test1 = "A SPARE SERAPE APPEARS AS"; GLsizei len = strlen(s); glCallLists(len, GL_BYTE, (GLbyte *)s); |
显示列表管理状态变量 #include "header.h" GLuint listName; static void init (void) { listName = glGenLists (1); glNewList (listName, GL_COMPILE); glColor3f (1.0, 0.0, 0.0); glBegin (GL_TRIANGLES); glVertex2f (0.0, 0.0); glVertex2f (1.0, 0.0); glVertex2f (0.0, 1.0); glEnd (); glTranslatef (1.5, 0.0, 0.0); glEndList (); glShadeModel (GL_FLAT); } static void drawLine (void) { glBegin (GL_LINES); glVertex2f (0.0, 0.5); glVertex2f (15.0, 0.5); glEnd (); } void display(void) { GLuint i; glClear (GL_COLOR_BUFFER_BIT); glColor3f (0.0, 1.0, 0.0); for (i = 0; i < 10; i++) glCallList (listName); drawLine (); glFlush (); } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) gluOrtho2D (0.0, 2.0, -0.5 * (GLfloat) h/(GLfloat) w, 1.5 * (GLfloat) h/(GLfloat) w); else gluOrtho2D (0.0, 2.0 * (GLfloat) w/(GLfloat) h, -0.5, 1.5); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(650, 50); glutCreateWindow(argv[0]); init (); glutReshapeFunc (reshape); glutDisplayFunc (display); glutKeyboardFunc (keyboard); glutMainLoop(); return 0; }
多个显示列表Demo
#include "header.h" #include <string.h> #define PT 1 #define STROKE 2 #define END 3 typedef struct charpoint { GLfloat x, y; int type; } CP; CP Adata[] = { { 0, 0, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 0, STROKE}, {0, 5, PT}, {5, 5, END} }; CP Edata[] = { {5, 0, PT}, {0, 0, PT}, {0, 10, PT}, {5, 10, STROKE}, {0, 5, PT}, {4, 5, END} }; CP Pdata[] = { {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT}, {4, 5, PT}, {0, 5, END} }; CP Rdata[] = { {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT}, {4, 5, PT}, {0, 5, STROKE}, {3, 5, PT}, {5, 0, END} }; CP Sdata[] = { {0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT}, {5, 4, PT}, {4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT}, {5, 9, END} }; static void drawLetter(CP *l) { glBegin(GL_LINE_STRIP); while (1) { switch (l->type) { case PT: if(l->y==0) { glColor3f(1.0,0.0,0.0); } glVertex2i(l->x,l->y); break; case STROKE: glVertex2i(l->x,l->y); glEnd(); glBegin(GL_LINE_STRIP); break; case END: glVertex2i(l->x,l->y); glEnd(); glTranslatef(8.0, 0.0, 0.0); return; } l++; } } GLuint base; static void init (void) { GLuint base; glShadeModel (GL_FLAT); base = glGenLists (128); glListBase(base); glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList(); glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList(); glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList(); glNewList(base+'R', GL_COMPILE); drawLetter(Rdata); glEndList(); glNewList(base+'S', GL_COMPILE); drawLetter(Sdata); glEndList(); glNewList(base+' ', GL_COMPILE); glTranslatef(8.0, 0.0, 0.0); glEndList(); } char *test1 = "A SPARE SERAPE APPEARS AS"; char *test2 = "APES PREPARE RARE PEPPERS"; static void printStrokedString(char *s) { GLsizei len = strlen(s); glCallLists(len, GL_BYTE, (GLbyte *)s); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glPushMatrix(); glScalef(2.0, 2.0, 2.0); glTranslatef(10.0, 30.0, 0.0); printStrokedString(test1); glPopMatrix(); glPushMatrix(); glScalef(2.0, 2.0, 2.0); glTranslatef(10.0, 13.0, 0.0); printStrokedString(test2); glPopMatrix(); glFlush(); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h); } void keyboard(unsigned char key, int x, int y) { switch (key) { case ' ': glutPostRedisplay(); break; case 27: exit(0); } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (440, 120); glutCreateWindow ("stroke"); init (); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutDisplayFunc(display); glutMainLoop(); return 0; }
|
- 浏览: 143090 次
- 性别:
- 来自: 长春
最新评论
发表评论
-
(转)OpenGL与DirectX 比较
2014-02-01 12:18 4401Linux易用性差的一个重要表现是对游戏的支持性差。当然,l ... -
OpenGL环境搭建
2014-01-28 08:08 892开发工具VS2008 OS: WIN7 搭建步骤 ... -
OpenGL学习四十:正玄移动
2014-01-28 08:08 863正玄波浪曲线的特点是一个周期在x(0-360°)之间,y在 ... -
OpenGL学习三十九:飘动的旗帜
2014-01-27 10:28 1852(此节内容对应NEHE教程第11课) 目前为止我们 ... -
OpenGL学习三十八:图片文字
2014-01-27 10:28 1213(此节内容对应NEHE教程第17课) 前面2节所创 ... -
OpenGL学习三十七:Windows 3D字体
2014-01-27 10:26 1384(此节内容对应NEHE教程第14课) 本节主要说明 ... -
OpenGL学习三十六:Windows 2D字体
2014-01-27 10:26 1271(此节内容对应NEHE教程第13课) 本节主要说明Ope ... -
OpenGL学习三十五:加载压缩TGA
2014-01-27 10:26 1004(此节内容对应NEHE教程第33课) 利用压缩算法 ... -
OpenGL学习三十四:剪裁区域和TGA图像文件的加载
2014-01-26 08:06 1234(此节内容对应NEHE教程第24课) 应用.tga ... -
OpenGL学习三十三:球面映射
2014-01-26 08:06 2686(此节内容对应NEHE教程第23课) 把环境纹理包 ... -
OpenGL学习三十二:二次几何体
2014-01-26 08:06 1845主要包含圆柱体(Cylinder)圆盘(Disk)球(Sp ... -
OpenGL学习三十一:累积缓冲区
2014-01-26 08:06 1182OpenGL除了颜色缓冲区 ... -
OpenGL学习三十:深度缓冲区与掩码
2014-01-26 08:05 7028深度缓冲区进行三维混合多边形的绘图顺序极大地影响了最终的混 ... -
OpenGL学习二十九:模板缓冲区与模板测试
2014-01-25 13:16 2164帧缓冲区有许多缓冲 ... -
OpenGL学习二十八:蒙版
2014-01-25 13:16 1981(本节对应分析NEHE教程 ... -
OpenGL学习二十七:混合
2014-01-25 13:16 874混合步骤:1.设置混合模式2.启用混合 glColor4 ... -
OpenGL学习二十六:雾
2014-01-25 13:15 1873雾效果是就是是远处看的模糊,一种类似于大气效果。雾是在执行 ... -
OpenGL学习二十五:像素存储模式
2014-01-25 13:14 1797内存对齐:字长32位的计算机上,如果数据在内存中按照32位 ... -
OpenGL学习二十四:绘制像素,位图,图像
2014-01-24 08:31 6423除了几何图形的渲染,还有两种重要的类型的数据渲染位图:由0 ... -
OpenGL学习二十三:多重纹理
2014-01-24 08:30 4529在进行纹理贴图是,一次是把一副图像应用在个一个 ...
相关推荐
OpenGL入门学习之八——使用显示列表.pdf
01:OpenGL窗口 02:多边形 03:添加颜色 04:旋转 05:3D空间 06:纹理映射 07:光照和键盘 08:混合 09:移动图像 10:3D世界 11:飘动的旗帜 12:显示列表 13:图像字体 14:图形字体 15:纹理图形字 16:雾 17:...
现代OpenGL+Qt学习笔记之三:显示一个彩色三角形http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77927876源码。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。微软的...
详细介绍参考我的博客
OpenGL 3D OPENGL三维显示,学习使用.初始化.应用
学习opengl显示点云的小demo,对初学者很有帮助,快速出门。
该工程采用Qt3D模块加载obj模型文件,最终将模型显示在窗口中。 环境:qt:5.9.6 系统:win10 64Bit obj文件:自带一份
最近在学习opengl的使用,也是参考别人的代码最后修改的成功的,qt5.6.0 才有opengl 显示三位scara机器人,支持旋转,移动,
OpenGL入门学习之十六——在Windows系统中显示文字.pdf
c# 学习OpenGL的示例程序, 包括NeHe的课程源码,红宝书源码等。都是c#的。
本次试验的目的很简单,只是显示一个窗口,可以通过F1键值来切换全屏显示和普通屏显示, 并当按下ESE键时退出程序。窗口的颜色背景和透视效果(其实该试验都没用上)等用opengl来实现, 主要是为后面的学习写了个框架...
这回尝试着将3DS文件载入自己写的OpenGL程序并且显示出来。 首先查找了许多现成载入3DS格式的例子,发现只有一个程序是可以运行的,于是就拿这个程序的源代码进行研究。同时查看了一些国外的格式说明文档,结合...
Qt5.7+VS2015 64位的环境,使用Qt的QOpenglWidget,来显示一张图片,采用GLSL。学习入门挺适合的。在网上找了很久资源,还是自己折腾搞定,特地分享出来。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL 是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚 至比TC更加简单。 2、强大的可移植性。 微软的...
vc下利用opengl实现的图像贴图与文字显示 希望对学习OpenGL的人有所帮助
这是一个我学会Opengl时的例子,主要是对Opengl的渲染场景设置,视图操作,渲染数据库等的封装,很好地把相关的职能分开,以便后续使用扩展。 这一源码主要体显示的三维软件的开发雏形,有兴趣的可以看一下。 由于...
红蓝显示,实现立体效果,比较简单,希望对你学习OPenGL有所帮助
而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形...
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的...