Use glArrayElement to construct primitives by indexing vertex data, rather than by streaming through arrays of data in first-to-last order. Because each call specifies only a single vertex, it is possible to explicitly specify per-primitive attributes such as a single normal per individual triangle.
Changes made to array data between the execution of glBegin and the
corresponding execution of glEnd may affect calls to glArrayElement that are made
within the same glBegin/glEnd period in non-sequential ways.
That is, a call to
glArrayElement that precedes a change to array data may access the changed data, and a call that follows a change to array data may access original data.
glArrayElement is included in display lists. If glArrayElement is entered into a display list, the necessary array data (determined by the array pointers and enables) is also entered into the display list. Because the array pointers and enables are client-side state, their values affect display lists when the lists are created, not when the lists are executed.