PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Display Lists


Einfachkrank
2002-11-13, 18:48:32
Hi,

einmal wäre da die Frage, nach Display Lists und Rekursion etc. Kann ich eine Liste in einer anderen aufrufen oder eine in sich selbst? Und mich würde einfach mal interessieren, wofür man die am besten nutzen kann(jetzt allgemein, die Listen) ? Wo bringt das Speed oder einfachere Handhabung?

MFG Einfachkrank

zeckensack
2002-11-14, 04:44:32
Lists dürfen andere List-Aufrufe beinhalten.
Lists dürfen sich auch selbst aufrufen (sollten man IMO aber vermeiden).

Da das erlaubt ist, und damit's trotzdem nicht zu unendlichen Schleifen kommen kann gibt's einen 'max nesting level'. Wenn der überschritten wird endet der Aufruf einfach. Dieses Maximum ist mindestens 64, und wird folgendermaßen abgefragt:
GLuint max_list_nesting;
glGetIntegerv(GL_MAX_LIST_NESTING,&max_list_nesting);

Display lists sind überall da nützlich, wo man's nicht mit deformierbaren Objekten (aka Animation) zu tun hat.

ZB ein komplettes Fußballstadion inklusive Tore kann man in eine Display list packen.
Dann braucht man pro Frame nur noch
set_view();
glCallList(stadium);
draw_players();
draw_ball();

Man sollte es aber IMO nicht übertreiben, denn ein solches Objekt läßt sich danach nicht mehr teilweise cullen.

Ansonsten kann man davon ausgehen daß man mit display lists auf so gut wie jeder Karte das Maximum an Geometrietransfer hinbekommt, wofür man sonst Extensions benutzen müßte.

Auch recht nützlich ist das Zusammenfassen von state changes in display lists. Wenn man zB ein 2D-Overlay über die 3D-Grafik malen will, kann man auch eine display list basteln, die keine Objekte zeichnet, sondern nur an den Matrizen spielt, Texturen bindet, blending modes umstellt etc (so habe ich das mal mit einer Konsole gemacht).

Wichtig:
Display Lists erfassen nur 'Server state'. Dh Kommandos die Client State verändern werden nicht in die list reinkompiliert, sondern sofort ausgeführt. Die genaue Unterteilung Client/Server state findest du hinten in der GL-Spezifikation (siehe Sticky).
Als prominentes Beispiel gehören die Zeiger für Vertex Arrays zum Client state (glVertexPointer*() ). Auch die mittels glDrawElements und anderen übertragenen Elemente von Vertex Arrays werden in einer Display list statisch. Bsp:

glInterleavedArrays(GL_C4UB_V3F,16,my_vertex_array);
glNewList(blablub,GL_COMPILE);
glDrawElements(<...>);
glEndList();

Die list enthält nun die vertices die zur Zeit des Aufrufs von glDrawElements im Vertex Array waren. Ändert man später den Inhalt des Arrays, ändert sich die Display List nicht. Sie zeichnet beim Aufruf immer noch den alten Inhalt des Vertex Arrays.

Einfachkrank
2002-11-15, 17:01:06
Hi,

ah ja, damit kann man schon mal was anfangen, jetzt hab ich noch mal eine ganz andere Frage, wollte eben nicht schon wieder nen neuen Thread aufmachen;
Für was nutzt man denn BSP`s und wie funktionieren die denn?

MFG Einfachkrank

Frank
2002-11-21, 14:31:11
Originally posted by zeckensack
Display lists sind überall da nützlich, wo man's nicht mit deformierbaren Objekten (aka Animation) zu tun hat.

Wie hoch ist der Verlusst denn, wenn ich die DL bei einer Animation anpasse anstatt direkt zu rendern?

zeckensack
2002-11-21, 14:52:15
Originally posted by Frank

Wie hoch ist der Verlusst denn, wenn ich die DL bei einer Animation anpasse anstatt direkt zu rendern? Display Lists kann man garnicht ändern ;)

Man kann sie höchstens löschen und neu erstellen.

Frank
2002-11-21, 16:48:26
in diesem Fall.... wie hoch wär der Verlußt?

zeckensack
2002-11-22, 02:45:41
Das hängt vom Treiber ab, aber du hast in jedem Fall Overhead für die Erzeugung der DL.

In Zahlen ausdrücken kann ich's nicht, aber ein Objekt was man nur ein einziges Mal darstellen will in eine DL zu packen wird immer schlechter sein als es sofort zu rendern.

DLs sollte man für Objekte nutzen, die sich nicht (oder nicht oft) ändern.

Btw, mit Animation meine ich jetzt daß sich das Objekt verformt. Veränderungen der Lage und Größe, die man mit den Matrixoperationen machen kann lassen sich natürlich auch auf fertige DLs anwenden.

Frank
2002-11-22, 11:29:05
naja hab jetzt zur Zeit ein Bézierpatch programmiert, der sich manuell und automatisch verformen läßt. Da mein Prozi aber nur nen P2 is und die Arbeit der Grafikkarte gleich mitmachen darf, hab ich das in einer DL realisiert. Die meiste Zeit bleibt die Fläche ja gleich ... und so dacht ich ... ??? :| :(

zeckensack
2002-11-22, 15:20:55
Originally posted by Frank
naja hab jetzt zur Zeit ein Bézierpatch programmiert, der sich manuell und automatisch verformen läßt. Da mein Prozi aber nur nen P2 is und die Arbeit der Grafikkarte gleich mitmachen darf, hab ich das in einer DL realisiert. Die meiste Zeit bleibt die Fläche ja gleich ... und so dacht ich ... ??? :| :( Jo, richtig.

Gegenfrage: Brauchst du hohe Frameraten, solange sich der Patch nicht verändert?

Wenn du nur den Patch renderst, dann sollte die Antwort nein lauten und du brauchst auch keine Display List dafür. Du kannst ja einfach einmal rendern, swappen und dann garnix mehr machen, bis zum nächsten User-Input.

Wenn das Ding drehbar ist, ohne die Control points zu ändern oder so, dann ist eine DL wiederum gut. Und natürlich auch wenn du noch was anderes nebenher renderst, das sich irgendwie bewegt.

IMHO, wenn du den Inhalt einer DL mindestens zweimal renderst, dann hast du den Overhead schon wieder raus :)

Frank
2002-11-22, 16:00:01
danke ... dann wär DL doch geeigneter