显示列表管理状态变量 显示列表可以包含用于修改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;
- }
-
|