21. OpenGL Display Lists (Version 2.0)
Introduction
Display lists in OpenGL are objects stored in memory that can be reused multiple times without requiring OpenGL to recreate them. This feature significantly improves performance, especially when rendering complex scenes with numerous objects. By using display lists, you can optimize your code while maintaining flexibility for textures, lighting, and transformations.
In this tutorial, you’ll learn how to create and call display lists to enhance the efficiency of your OpenGL applications.
What Are Display Lists?
A display list stores rendering commands for an object. Once created, it can be called repeatedly, reducing the processing overhead. However:
- You cannot modify the geometry or shape stored in a display list after it’s created.
- You can still apply transformations, scaling, and textures to objects stored in a display list.
Creating a Display List
Creating a display list involves the following steps:
1. Generate a display list identifier.
2. Define the list using rendering commands.
3. Finalize the list.
Here’s an example:
// Step 1: Generate a display list identifier GLuint cubelist = glGenLists(1); // Step 2: Define the display list glNewList(cubelist, GL_COMPILE); glPushMatrix(); glutSolidCube(2); // Draw a solid cube glPopMatrix(); glEndList(); // Step 3: Finalize the display list
Calling a Display List
Once the display list is created, you can call it anytime using:
glCallList(cubelist); // Call the display list
Ensure that the list is created before calling it; otherwise, nothing will be displayed.
Tutorial Code
Below is the complete code demonstrating the creation and usage of a display list for a cube:
#include <GL/gl.h> #include <GL/glut.h> GLuint cubelist; // Display list identifier // Function to create a display list for a cube void createcube(void) { cubelist = glGenLists(1); // Generate the display list glNewList(cubelist, GL_COMPILE); // Begin the display list glPushMatrix(); glutSolidCube(2); // Draw a solid cube glPopMatrix(); glEndList(); // Finalize the display list } // Initialization function void init(void) { glEnable(GL_DEPTH_TEST); // Enable depth testing glEnable(GL_LIGHTING); // Enable lighting glEnable(GL_LIGHT0); // Enable LIGHT0 (diffuse light) glShadeModel(GL_SMOOTH); // Set shading to smooth createcube(); // Create the display list } // Display callback function void display(void) { glClearColor(0.0, 0.0, 0.0, 1.0); // Clear the screen to black glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear buffers glLoadIdentity(); glTranslatef(0.0, 0.0, -5.0); // Translate the scene glCallList(cubelist); // Call the display list glutSwapBuffers(); // Swap the buffers } // Reshape callback function void reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } // Keyboard callback function void keyboard(unsigned char key, int x, int y) { if (key == 27) { // Escape key glutLeaveGameMode(); // Exit fullscreen mode exit(0); // Quit the program } } // Main function int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); // Double buffering with depth testing glutGameModeString("1024x768:32@75"); // Fullscreen mode settings glutEnterGameMode(); // Enter fullscreen mode init(); // Initialize settings glutDisplayFunc(display); // Set display callback glutIdleFunc(display); // Set idle callback glutReshapeFunc(reshape); // Set reshape callback glutKeyboardFunc(keyboard); // Set keyboard callback glutMainLoop(); // Enter the main event loop return 0; }
If you have any questions or run into issues, feel free to email me at swiftless@gmail.com. Happy coding!
Hey, just tried this tutorial and it all works very nicely (so good on you for that) but I am having some difficulty will using this with an object with variable… er… variable.
For this quad I am using a variable y value (in 3d space) which works fine normally, but when I put it into here the shape does not show the variable value changing at all (I’m trying to get water wave effects working on a game).
Any thoughts?
Thanks in advance
Hey TBM,
Your question doesn’t make much sense at first glance, what does the y value do? Also, it wouldn’t be wise to use variables in display lists, they are only meant to store shapes that don’t change.
Cheers,
Swiftless
Hey people,
I can’t enter into the GameMode, the ms-dos window appears with a message that “unrecognized string in game mode” , “cannot create windows in game mode” . i think its related to the glutGameModeString(“…”);, i copied the string from here too , still got the error
Please help me.
It means either the resolution you are trying to use or the refresh rate are not supported by your hardware, try changing the 75 to a 60 and running it.
These are great tutorials, you explain things very well 😀