glNewList()

glNewList ist definiert im OpenGL zugehörigen Include des jeweiligen Betriebsystems.

Funktion

glNewList erzeugt eine neue Liste von Konstruktionsanweisungen, um einen Körper zu generieren. Es wird gewissermaßen ein Bauplan in der Grafikkarte abgelegt. Die Konstruktion eines Körpers ist anschließend mit glCallList() bzw. glCallLists() möglich.

Dabei werden alle Anweisungen sogleich mit den übergebenen Werten an die Grafikkarte übermittelt. Berechnungen werden also einmalig durchgeführt und der berechnete Bauplan in den Grafikspeicher geladen. Da die Berechnungen einmalig sind, spart das Zeit, allerdings kann eine in die Grafikkarte geladener DisplayList nicht mehr geändert werden. Möchte man beispielsweise die Farbe eines Bauteils ändern, so empfielt es sich, die Farbe nicht Teil des Bauplans werden zu lassen, sondern erst die Farbe zu setzen und dann die Liste mit der gesetzten Farbe konstruieren zu lassen.

In eine DisplayListe können grundsätzliche alle Befehle zum Konstruieren aufgenommen werden, wie glTranslate(), glRotate(), glScale, sowie die eigentliche Übergabe von Polygonen mit glBegin()/glEnd(). Wichtig ist, dass man auch mit glCallList()/glCallLists() auf bereits vorhandene DisplayListen zugreifen kann. Dabei werden die Listen nicht in die hier zu definierende Liste einkopiert, sondern wirklich aufgerufen. Ändern sich die aufgerufenen DisplayListen, so ändern sich damit auch das, was durch diese Liste erzeugt wird.

Signatur

void glNewList(GLuint list, GLenum mode);

list: Der Index, der zu verändernden DisplayListe.
mode: Gibt an, ob bei der Eingabe direkt ein Objekt erzeugt werden soll

mode Bedeutung
GL_COMPILE Die Anweisungen direkt in die DisplayListe kompilieren
Dies eignet sich, um vor dem Zeichnen, Objektbeschreibungen in die Grafikkarte zu laden, um diese später beim Zeichnen der Szene zu verwenden.
GL_COMPILE_AND_EXECUTE Die Anweisungen in die DisplayListe kompilieren und gleichzeitig sofort ausführen
Dies eignet sich, um eine Szene zu zeichnen und dieses Element später noch wiederholt in die Szene zu kopieren.

Hinweise

Die folgenden Befehle werden nicht in die DisplayListe einkompiliert.glAreTexturesResident(), glColorPointer(), glDeleteLists(), glDeleteTextures(), glDisableClientState(), glEdgeFlagPointer(), glEnableClientState(), glFeedbackBuffer(), glFinish(), glFlush(), glGenLists(), glGenTextures(), glIndexPointer(), glInterleavedArrays(), glIsEnabled(), glIsList(), glIsTexture(), glNormalPointer(), glPopClientAttrib(), glPixelStore(), glPushClientAttrib(), glReadPixels(), glRenderMode(), glSelectBuffer(), glTexCoordPointer(), glVertexPointer(), sowie alle glGet() Befehle.

glTexImage1D(), glTexImage2D() und glTexImage3D() werden ebenso sofort ausgeführt und nicht in die DisplayListe einkompiliert, wenn ihr erstes Argument GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D, oder GL_PROXY_TEXTURE_3D ist.

Sofern die ARB_imaging Erweiterung unterstützt wird, wird glHistogram() sofort ausgeführt, wenn es mit GL_PROXY_HISTOGRAM gerufen wird. Ähnlich dazu wird glColorTable() sofort ausgeführt, wenn das erste Argument GL_PROXY_COLOR_TABLE, GL_PROXY_POST_CONVOLUTION_COLOR_TABLE oder GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE ist.

Bei OpenGL V1.3 und höher oder wenn die ARB_multitexture Erweiterung unterstützt wird, so wird glClientActiveTexture() nicht in die Liste kompiliert sondern sofort ausgeführt.

In Kurzfassung ergibt sich, dass Veränderungen am Grafikspeicher, sowie Abfragen sofort ausgeführt werden, da Abfragen in einem statischen Baupaln zur Laufzeit nicht mehr ausgewertet würden und Veränderungen im Grafikspeicher (Texturen, Listen) durch die wiederholte Konstruktion eines Objektes keinen Sinn ergeben.

Wenn glEndList() gerufen wird, wird die erstellte DisplayListe vollständig an dem übergebenen Index list gebunden. Sofern der Index bereits mit einer anderen DisplayListe belegt war, so wird die Liste ausgetauscht.

Abfragen

glIsList()
glGet() mit GL_LIST_INDEX
glGet() mit GL_LIST_MODE

Fehler

Folgende Werte können als Fehler generiert werden:

GL_INVALID_VALUE: list ist 0.
GL_INVALID_ENUM: Als mode wurde ein ungültiger Wert übergeben.
GL_INVALID_OPERATION: glEndList() wurde ohne vorhergehendes glNewList() gerufen oder glNewList() wird gerufen, während bereits eine DisplayListe definiert wird, also vor glEndList().
GL_INVALID_OPERATION: glNewList() oder glEndList() wurde zwischen einen glBegin() und glEnd()-Abschnitt aufgerufen.
GL_OUT_OF_MEMORY: Es ist nicht mehr genug Speicher vorhanden, um diese DisplayListe zu kompilieren. Sofern die OpenGL Version 1.1. oder höher ist, so werden keine Änderungen an den bisherigen DisplayListen durchgeführt und auch der Status der GL-Engine wird nicht verändert, so als wäre nie versucht worden, eine DisplayListe zu verändern.

Beispiel

siehe auch