显示列表

来源:互联网 发布:淘宝模特拍照姿势技巧 编辑:程序博客网 时间:2024/05/17 09:34
显示列表可以提高性能,因为他可以存储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:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #include "header.h"  
  2.   
  3. GLuint listName;  
  4.   
  5. static void init (void)  
  6. {  
  7.    listName = glGenLists (1);  
  8.    glNewList (listName, GL_COMPILE);  
  9.       glColor3f (1.0, 0.0, 0.0);   
  10.       glBegin (GL_TRIANGLES);  
  11.       glVertex2f (0.0, 0.0);  
  12.       glVertex2f (1.0, 0.0);  
  13.       glVertex2f (0.0, 1.0);  
  14.       glEnd ();  
  15.       glTranslatef (1.5, 0.0, 0.0);   
  16.    glEndList ();  
  17.    glShadeModel (GL_FLAT);  
  18. }  
  19.   
  20. static void drawLine (void)  
  21. {  
  22.    glBegin (GL_LINES);  
  23.    glVertex2f (0.0, 0.5);  
  24.    glVertex2f (15.0, 0.5);  
  25.    glEnd ();  
  26. }  
  27.   
  28. void display(void)  
  29. {  
  30.    GLuint i;  
  31.   
  32.    glClear (GL_COLOR_BUFFER_BIT);  
  33.    glColor3f (0.0, 1.0, 0.0);   
  34.    for (i = 0; i < 10; i++)     
  35.       glCallList (listName);  
  36.    drawLine ();    
  37.                   
  38.    glFlush ();  
  39. }  
  40.   
  41. void reshape(int w, int h)  
  42. {  
  43.    glViewport(0, 0, w, h);  
  44.    glMatrixMode(GL_PROJECTION);  
  45.    glLoadIdentity();  
  46.    if (w <= h)   
  47.       gluOrtho2D (0.0, 2.0, -0.5 * (GLfloat) h/(GLfloat) w,   
  48.          1.5 * (GLfloat) h/(GLfloat) w);  
  49.    else   
  50.       gluOrtho2D (0.0, 2.0 * (GLfloat) w/(GLfloat) h, -0.5, 1.5);   
  51.    glMatrixMode(GL_MODELVIEW);  
  52.    glLoadIdentity();  
  53. }  
  54.   
  55. void keyboard(unsigned char key, int x, int y)  
  56. {  
  57.    switch (key) {  
  58.       case 27:  
  59.          exit(0);  
  60.          break;  
  61.    }  
  62. }  
  63.   
  64.   
  65. int main(int argc, char** argv)  
  66. {  
  67.    glutInit(&argc, argv);  
  68.    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);  
  69.    glutInitWindowSize(650, 50);  
  70.    glutCreateWindow(argv[0]);  
  71.    init ();  
  72.    glutReshapeFunc (reshape);  
  73.    glutDisplayFunc (display);  
  74.    glutKeyboardFunc (keyboard);  
  75.    glutMainLoop();  
  76.    return 0;  
  77. }  


多个显示列表Demo:

[cpp] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. #include "header.h"  
  2. #include <string.h>  
  3.   
  4. #define PT 1  
  5. #define STROKE 2  
  6. #define END 3  
  7.   
  8. typedef struct charpoint {  
  9.    GLfloat   x, y;  
  10.    int    type;  
  11. } CP;  
  12.   
  13. CP Adata[] = {  
  14.    { 0, 0, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},   
  15.    {5, 9, PT}, {5, 0, STROKE}, {0, 5, PT}, {5, 5, END}  
  16. };  
  17.   
  18. CP Edata[] = {  
  19.    {5, 0, PT}, {0, 0, PT}, {0, 10, PT}, {5, 10, STROKE},  
  20.    {0, 5, PT}, {4, 5, END}  
  21. };  
  22.   
  23. CP Pdata[] = {  
  24.    {0, 0, PT}, {0, 10, PT},  {4, 10, PT}, {5, 9, PT}, {5, 6, PT},   
  25.    {4, 5, PT}, {0, 5, END}  
  26. };  
  27.   
  28. CP Rdata[] = {  
  29.    {0, 0, PT}, {0, 10, PT},  {4, 10, PT}, {5, 9, PT}, {5, 6, PT},   
  30.    {4, 5, PT}, {0, 5, STROKE}, {3, 5, PT}, {5, 0, END}  
  31. };  
  32.   
  33. CP Sdata[] = {  
  34.    {0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT}, {5, 4, PT},   
  35.    {4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT}, {1, 10, PT},   
  36.    {4, 10, PT}, {5, 9, END}  
  37. };  
  38.   
  39.   
  40. static void drawLetter(CP *l)  
  41. {  
  42.    glBegin(GL_LINE_STRIP);  
  43.    while (1) {  
  44.       switch (l->type) {  
  45.          case PT:  
  46.              if(l->y==0)  
  47.              {  
  48.                  glColor3f(1.0,0.0,0.0);  
  49.              }  
  50.             glVertex2i(l->x,l->y);  
  51.             break;  
  52.          case STROKE:  
  53.             glVertex2i(l->x,l->y);  
  54.             glEnd();  
  55.             glBegin(GL_LINE_STRIP);  
  56.             break;  
  57.          case END:  
  58.             glVertex2i(l->x,l->y);  
  59.             glEnd();  
  60.             glTranslatef(8.0, 0.0, 0.0);  
  61.             return;  
  62.       }  
  63.       l++;  
  64.    }  
  65. }  
  66. GLuint base;  
  67.   
  68. static void init (void)  
  69. {  
  70.    GLuint base;  
  71.   
  72.    glShadeModel (GL_FLAT);  
  73.   
  74.    base = glGenLists (128);  
  75.    glListBase(base);  
  76.    glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList();  
  77.    glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList();  
  78.    glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList();  
  79.    glNewList(base+'R', GL_COMPILE); drawLetter(Rdata); glEndList();  
  80.    glNewList(base+'S', GL_COMPILE); drawLetter(Sdata); glEndList();  
  81.    glNewList(base+' ', GL_COMPILE); glTranslatef(8.0, 0.0, 0.0); glEndList();  
  82. }  
  83.   
  84. char *test1 = "A SPARE SERAPE APPEARS AS";  
  85. char *test2 = "APES PREPARE RARE PEPPERS";  
  86.   
  87. static void printStrokedString(char *s)  
  88. {  
  89.     
  90.    GLsizei len = strlen(s);  
  91.     
  92.    glCallLists(len, GL_BYTE, (GLbyte *)s);  
  93. }  
  94.   
  95. void display(void)  
  96. {  
  97.    glClear(GL_COLOR_BUFFER_BIT);  
  98.    glColor3f(1.0, 1.0, 1.0);  
  99.    glPushMatrix();  
  100.    glScalef(2.0, 2.0, 2.0);  
  101.    glTranslatef(10.0, 30.0, 0.0);  
  102.    printStrokedString(test1);  
  103.    glPopMatrix();  
  104.    glPushMatrix();  
  105.    glScalef(2.0, 2.0, 2.0);  
  106.    glTranslatef(10.0, 13.0, 0.0);  
  107.    printStrokedString(test2);  
  108.    glPopMatrix();  
  109.    glFlush();  
  110. }  
  111.   
  112. void reshape(int w, int h)  
  113. {  
  114.    glViewport(0, 0, (GLsizei) w, (GLsizei) h);  
  115.    glMatrixMode (GL_PROJECTION);  
  116.    glLoadIdentity ();  
  117.    gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);  
  118. }  
  119.   
  120. void keyboard(unsigned char key, int x, int y)  
  121. {  
  122.    switch (key) {  
  123.       case ' ':  
  124.          glutPostRedisplay();  
  125.          break;  
  126.       case 27:  
  127.          exit(0);  
  128.    }  
  129. }  
  130.   
  131.   
  132. int main(int argc, char** argv)  
  133. {  
  134.    glutInit(&argc, argv);  
  135.    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);  
  136.    glutInitWindowSize (440, 120);  
  137.    glutCreateWindow ("stroke");  
  138.    init ();  
  139.    glutReshapeFunc(reshape);  
  140.    glutKeyboardFunc(keyboard);  
  141.    glutDisplayFunc(display);  
  142.    glutMainLoop();  
  143.    return 0;  
  144. }  
  145.   
0 0
原创粉丝点击