显示列表可以提高性能,因为他可以存储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; }
|
- 浏览: 146870 次
- 性别:
- 来自: 长春
最新评论
发表评论
-
(转)OpenGL与DirectX 比较
2014-02-01 12:18 4481Linux易用性差的一个重要表现是对游戏的支持性差。当然,l ... -
OpenGL环境搭建
2014-01-28 08:08 925开发工具VS2008 OS: WIN7 搭建步骤 ... -
OpenGL学习四十:正玄移动
2014-01-28 08:08 904正玄波浪曲线的特点是一个周期在x(0-360°)之间,y在 ... -
OpenGL学习三十九:飘动的旗帜
2014-01-27 10:28 1894(此节内容对应NEHE教程第11课) 目前为止我们 ... -
OpenGL学习三十八:图片文字
2014-01-27 10:28 1243(此节内容对应NEHE教程第17课) 前面2节所创 ... -
OpenGL学习三十七:Windows 3D字体
2014-01-27 10:26 1450(此节内容对应NEHE教程第14课) 本节主要说明 ... -
OpenGL学习三十六:Windows 2D字体
2014-01-27 10:26 1308(此节内容对应NEHE教程第13课) 本节主要说明Ope ... -
OpenGL学习三十五:加载压缩TGA
2014-01-27 10:26 1051(此节内容对应NEHE教程第33课) 利用压缩算法 ... -
OpenGL学习三十四:剪裁区域和TGA图像文件的加载
2014-01-26 08:06 1285(此节内容对应NEHE教程第24课) 应用.tga ... -
OpenGL学习三十三:球面映射
2014-01-26 08:06 2755(此节内容对应NEHE教程第23课) 把环境纹理包 ... -
OpenGL学习三十二:二次几何体
2014-01-26 08:06 1912主要包含圆柱体(Cylinder)圆盘(Disk)球(Sp ... -
OpenGL学习三十一:累积缓冲区
2014-01-26 08:06 1235OpenGL除了颜色缓冲区 ... -
OpenGL学习三十:深度缓冲区与掩码
2014-01-26 08:05 7095深度缓冲区进行三维混合多边形的绘图顺序极大地影响了最终的混 ... -
OpenGL学习二十九:模板缓冲区与模板测试
2014-01-25 13:16 2217帧缓冲区有许多缓冲 ... -
OpenGL学习二十八:蒙版
2014-01-25 13:16 2043(本节对应分析NEHE教程 ... -
OpenGL学习二十七:混合
2014-01-25 13:16 913混合步骤:1.设置混合模式2.启用混合 glColor4 ... -
OpenGL学习二十六:雾
2014-01-25 13:15 1936雾效果是就是是远处看的模糊,一种类似于大气效果。雾是在执行 ... -
OpenGL学习二十五:像素存储模式
2014-01-25 13:14 1836内存对齐:字长32位的计算机上,如果数据在内存中按照32位 ... -
OpenGL学习二十四:绘制像素,位图,图像
2014-01-24 08:31 6550除了几何图形的渲染,还有两种重要的类型的数据渲染位图:由0 ... -
OpenGL学习二十三:多重纹理
2014-01-24 08:30 4571在进行纹理贴图是,一次是把一副图像应用在个一个 ...
相关推荐
### OpenGL入门学习之八——使用显示列表:深入解析与应用 #### 一、OpenGL与显示列表的概念 OpenGL,即Open Graphics Library,是一个跨语言、跨平台的应用程序接口(API),用于渲染2D、3D矢量图形。它是计算机...
OpenGL显示列表是OpenGL编程中一个重要的优化工具,它允许开发者预先编译图形绘制命令,以提高3D场景的渲染效率。在《OpenGL显示列表使用》的主题中,我们将深入探讨显示列表的工作原理、创建方法以及如何利用它们来...
这个程序特别适用于学习和理解OpenGL的基本概念以及如何在三维空间中进行图形绘制。以下是对该实验代码的主要知识点的详细说明: 1. **OpenGL基础知识**:OpenGL是一个跨语言、跨平台的图形库,用于渲染二维、三维...
在初学者学习OpenGL时,理解如何创建、使用和管理显示列表是至关重要的。创建一个显示列表的步骤如下: 1. 首先,通过`glGenLists()`函数生成一个或多个显示列表的标识符。这个函数返回一个整数,表示显示列表的...
OpenGL显示列表是OpenGL编程中的一个重要概念,用于优化图形渲染性能。在计算机图形学实验中,尤其是在涉及大量重复绘制相同或类似对象的场景下,显示列表能够显著提高效率。本实验旨在深入理解显示列表的工作原理...
OpenGL显示列表是OpenGL编程中一个重要的优化技术,用于加速图形绘制过程。在计算机图形学领域,尤其是在游戏开发、科学可视化和交互式应用中,高效渲染是至关重要的。本篇文章将详细探讨显示列表的功能、原理以及...
- **OpenGL状态机**:学习如何设置颜色、深度测试、混合模式等状态。 - **Windows API**:掌握如何使用Windows API创建和管理窗口,以及处理消息队列。 - **时间同步**:学习如何用适当的方式获取和处理时间,确保...
在Android平台上,OpenGL ES(OpenGL for Embedded Systems)是用于图形渲染的重要库,广泛应用于游戏开发、3D模型显示等场景。本示例将带你入门Android中的OpenGL ES,通过绘制基本的几何图形——三角形和正方形,...
在学习这个实例时,你可能会接触到以下几个关键的OpenGL概念和函数: 1. `glGenTextures()`:生成纹理对象,这是纹理映射的基础。 2. `glBindTexture()`:绑定纹理对象,使其成为当前操作的目标。 3. `glTexImage2D...
通过这个DELPHI版的OpenGL教程,读者不仅可以学习到OpenGL的基本概念和操作,还能掌握如何在DELPHI环境中有效地应用这些知识。每个教程都结合实例,使得学习更为直观和实用。对于想要在DELPHI程序中嵌入复杂图形功能...
本文将深入探讨在Qt中使用OpenGL进行文字显示、透视投影、纹理贴图以及抗锯齿的技术。 首先,让我们来看看“QtOpenGL文字显示”这个主题。在OpenGL中,显示文本通常需要额外的库支持,如FreeType或GLUT,因为OpenGL...
01:OpenGL窗口 02:多边形 03:添加颜色 04:旋转 05:3D空间 06:纹理映射 07:光照和键盘 08:混合 09:移动图像 10:3D世界 11:飘动的旗帜 12:显示列表 13:图像字体 14:图形字体 15:纹理图形字 16:雾 17:...
OpenGL 是一种广泛应用于图形...这个简单的程序展示了如何在OpenGL环境中创建并显示一个点,对于初学者来说,这是一个很好的起点,后续可以学习更多复杂图元的绘制,如线段、三角形,以及颜色、光照、纹理等高级特性。
在Windows编程环境中,基于对话框(Dialog Box)的OpenGL显示是一种常见的实现图形用户界面(GUI)的方法。...通过学习和实践,开发者可以更好地掌握在受限的窗口环境中使用OpenGL进行3D图形显示和交互控制。
这个"glgif"项目可能包含了实现以上步骤的源代码,通过学习和分析,你可以深入理解如何在OpenGL ES环境下处理和显示GIF动画。注意,实际项目中,可能还需要考虑内存限制、资源释放以及平台兼容性等问题。
在这个主题中,我们将深入探讨“旋转的红伞”如何利用OpenGL显示列表和颜色特性来创建三维模型,以及如何构建面和体。 首先,OpenGL显示列表是预编译的OpenGL指令集合,可以大大提高渲染效率。当你需要重复绘制相同...
### OpenGL入门学习之十六——在Windows系统中显示文字 #### 一、引言 在进行图形编程时,尤其是在使用OpenGL这种强大的图形库时,我们往往需要处理不仅仅是图像本身,还包括文本信息的显示。然而,OpenGL并没有...
这个“OpenGL.rar”压缩包包含了OpenGL的参考手册,提供了对OpenGL API的详细解释,对于学习和开发使用OpenGL的应用程序至关重要。 OpenGL参考手册通常分为多个部分,包括核心规范、扩展规格、以及编程指南等。手册...