`
tiankefeng0520
  • 浏览: 145688 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

OpenGL学习十二:显示列表

阅读更多
显示列表可以提高性能,因为他可以存储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);

显示列表管理状态变量
显示列表可以包含用于修改opengl状态变量值的函数,这些值在执行显示列表时被修改,并且这些值在显示列表执行完仍然会保持,简单的说,假如在显示列表中设置 glColor(1,0,0), 在显示列表执行完成后,设置的颜色依然起作用。

有时候,我们希望显示列表的修改对后面不产生影响,这就需要进行恢复属性
  glNewList (listName, mode);
   glPushMatrix();
   glPushAttrib(GL_CURRENT_BIT)
    ...
   do_some_draw();

   glPopAttrib()
   glPopMatrix();
  glEndList ();

 显示列表Demo:

#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;
}

 

分享到:
评论

相关推荐

    OpenGL入门学习之八——使用显示列表.pdf

    ### OpenGL入门学习之八——使用显示列表:深入解析与应用 #### 一、OpenGL与显示列表的概念 OpenGL,即Open Graphics Library,是一个跨语言、跨平台的应用程序接口(API),用于渲染2D、3D矢量图形。它是计算机...

    opengl显示列表使用

    OpenGL显示列表是OpenGL编程中一个重要的优化工具,它允许开发者预先编译图形绘制命令,以提高3D场景的渲染效率。在《OpenGL显示列表使用》的主题中,我们将深入探讨显示列表的工作原理、创建方法以及如何利用它们来...

    OpenGL实验二:绘制钟表.zip

    这个程序特别适用于学习和理解OpenGL的基本概念以及如何在三维空间中进行图形绘制。以下是对该实验代码的主要知识点的详细说明: 1. **OpenGL基础知识**:OpenGL是一个跨语言、跨平台的图形库,用于渲染二维、三维...

    OpenGL 多级显示列表示例代码

    在初学者学习OpenGL时,理解如何创建、使用和管理显示列表是至关重要的。创建一个显示列表的步骤如下: 1. 首先,通过`glGenLists()`函数生成一个或多个显示列表的标识符。这个函数返回一个整数,表示显示列表的...

    OpenGL 显示列表

    OpenGL显示列表是OpenGL编程中的一个重要概念,用于优化图形渲染性能。在计算机图形学实验中,尤其是在涉及大量重复绘制相同或类似对象的场景下,显示列表能够显著提高效率。本实验旨在深入理解显示列表的工作原理...

    display-list.rar_list_opengl_opengl list_opengl 显示列表

    OpenGL显示列表是OpenGL编程中一个重要的优化技术,用于加速图形绘制过程。在计算机图形学领域,尤其是在游戏开发、科学可视化和交互式应用中,高效渲染是至关重要的。本篇文章将详细探讨显示列表的功能、原理以及...

    (vc6.0)opengl小程序:clock

    - **OpenGL状态机**:学习如何设置颜色、深度测试、混合模式等状态。 - **Windows API**:掌握如何使用Windows API创建和管理窗口,以及处理消息队列。 - **时间同步**:学习如何用适当的方式获取和处理时间,确保...

    Android OpenGL入门示例:绘制三角形和正方形

    在Android平台上,OpenGL ES(OpenGL for Embedded Systems)是用于图形渲染的重要库,广泛应用于游戏开发、3D模型显示等场景。本示例将带你入门Android中的OpenGL ES,通过绘制基本的几何图形——三角形和正方形,...

    OpenGL入门学习之十二——OpenGL片断测试.pdf

    OpenGL入门学习之十二——OpenGL片断测试,深入探讨了OpenGL中的两种关键的片断测试机制:剪裁测试和Alpha测试,这些机制对于控制图形渲染的精确度和效果至关重要。 ### 剪裁测试 剪裁测试是OpenGL中用于限定绘制...

    OpenGL.zip_opengl_site:www.pudn.com_四边形

    在学习这个实例时,你可能会接触到以下几个关键的OpenGL概念和函数: 1. `glGenTextures()`:生成纹理对象,这是纹理映射的基础。 2. `glBindTexture()`:绑定纹理对象,使其成为当前操作的目标。 3. `glTexImage2D...

    OpenGL学习OpenGL学习

    OpenGL最初设计为与C语言紧密集成,因此对于熟悉C语言的人来说,学习起来相对容易。OpenGL的优势在于其强大的可移植性,不仅适用于Windows,还支持Unix/Linux和其他操作系统,甚至在高端计算和专业设备上也有应用。 ...

    OpenGL详细教程 DELPHI 版

    通过这个DELPHI版的OpenGL教程,读者不仅可以学习到OpenGL的基本概念和操作,还能掌握如何在DELPHI环境中有效地应用这些知识。每个教程都结合实例,使得学习更为直观和实用。对于想要在DELPHI程序中嵌入复杂图形功能...

    QtOpenGL文字显示

    本文将深入探讨在Qt中使用OpenGL进行文字显示、透视投影、纹理贴图以及抗锯齿的技术。 首先,让我们来看看“QtOpenGL文字显示”这个主题。在OpenGL中,显示文本通常需要额外的库支持,如FreeType或GLUT,因为OpenGL...

    学习OpenGL必备教程nehe_opengl_chs.chm & 全部课程的源程序

    01:OpenGL窗口 02:多边形 03:添加颜色 04:旋转 05:3D空间 06:纹理映射 07:光照和键盘 08:混合 09:移动图像 10:3D世界 11:飘动的旗帜 12:显示列表 13:图像字体 14:图形字体 15:纹理图形字 16:雾 17:...

    opengl学习资料收集

    OpenGL 是一种广泛应用于图形...这个简单的程序展示了如何在OpenGL环境中创建并显示一个点,对于初学者来说,这是一个很好的起点,后续可以学习更多复杂图元的绘制,如线段、三角形,以及颜色、光照、纹理等高级特性。

    基于对话框的OpenGL显示

    在Windows编程环境中,基于对话框(Dialog Box)的OpenGL显示是一种常见的实现图形用户界面(GUI)的方法。...通过学习和实践,开发者可以更好地掌握在受限的窗口环境中使用OpenGL进行3D图形显示和交互控制。

    基于opengl es 的显示gif的例子

    这个"glgif"项目可能包含了实现以上步骤的源代码,通过学习和分析,你可以深入理解如何在OpenGL ES环境下处理和显示GIF动画。注意,实际项目中,可能还需要考虑内存限制、资源释放以及平台兼容性等问题。

    旋转的红伞OpenGL显示列表与颜色的应用,面和体的创建

    在这个主题中,我们将深入探讨“旋转的红伞”如何利用OpenGL显示列表和颜色特性来创建三维模型,以及如何构建面和体。 首先,OpenGL显示列表是预编译的OpenGL指令集合,可以大大提高渲染效率。当你需要重复绘制相同...

    OpenGL入门学习之十六——在Windows系统中显示文字.pdf

    ### OpenGL入门学习之十六——在Windows系统中显示文字 #### 一、引言 在进行图形编程时,尤其是在使用OpenGL这种强大的图形库时,我们往往需要处理不仅仅是图像本身,还包括文本信息的显示。然而,OpenGL并没有...

Global site tag (gtag.js) - Google Analytics