NeHe OpenGL Lesson12 – Display Lists
This lesson shows us how to use the OpenGL display list. Display list is a special feature with OpenGL, that D3D does not have.
A Display list is an OpenGL commands optimized cache. Some of it’s command will be optimized to display card supported commands. Some commands like matrix set up will pre-calculating. And it will resident on the server side instead of client side, this will improve the speed significantly by avoid transferring the OpenGL command from client to server again and again. Of course, running the graphic part on the server only work for the early graphic workstation. The porn of display list is that, it is fully static. You could not modify a display list content after you create and set up one.
Not all thing could be put into the display list could be used to improve the performance. The following are some items that you could put into the display list:
1) matrix set up and operation;
2) vertex data, like the vertex position, texture coordinates, vertex normal;
3) material set up, put the material switch in the display list could reduce material switch time. Render states switching is time wasting, you could improve the whole performance by sorting materials;
4) texture object;
5) polygon fill mode.
Steps to create and use display list are very easy:
box=glGenLists(2); glNewList(box,GL_COMPILE); // glBegin(), glEnd(), some 3D API rendering commands used here glEndList();
The above code used to create display list. As you see, it seems something pre-render into the display list. To use this display list:
glCallList(box);
The above line of code will be called in the DrawScene. This will make the display list content display on the main scene.
Another interested point is about using glEnable(GL_COLOR_MATERIAL). This will make the color set by glColor3f blend with the texture. A full combination to make all thing happen is like this:
glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); // Enable Lighting glEnable(GL_COLOR_MATERIAL); // Enable Material Coloring …… glColor3fv(boxcol[yloop-1]); // work with GL_COLOR_MATERIAL setting glCallList(box);
As you see, we may have lighting, material, color from glColor3fv, textures. A lots of stuffs come together, so how about the final color will be? How about OpenGL built-in functions handle them with fixed pipeline? If you use programmable render pipeline like vertex shader or pixel shader, you will not have such headache problem. You could define your own rules of applying all those stuffs, also with a very clear map. But comes to fixed pipeline, it seems more complicated. An article for deep further presented here.
The full source code could be found here.