PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie funktionieren Indices//indizierte Dreiecke?


Simon
2003-02-13, 12:32:48
Hallo,

ich les in letzter Zeit immer öfter von indizierten Dreiecken/Indices in Zusammenhang mit Vertex Arrays in OpenGL. Nur hab ich dazu noch keine gute Doku gefunden, wozu die gut sind und wie man sie erstellt. In "OpenGL Game Programming" wird nur gesagt, dass es sie zwar gibt, aber nicht, wie man welche erstellt oder so. Bis jetzt render ich solche Arrays immer mit glDrawArrays(). Wenn ich mir den Code zu den Indices so angucke, dann sind da für dieselbe Menge an gezeichneten Dreiecken viel mehr API-Calls ...

Kann mich jemand darüber aufklären?

bye Simon

zeckensack
2003-02-13, 14:47:55
'Indizierte' Geometrie erlaubt das Wiederbenutzen von Vertices.

Wenn du zB einen Triangle Fan nicht als Fan renderst, sondern als Haufen einzelner Dreiecke, müßtest du ohne Indizes pro Dreieck drei eigene Vertices haben. Mit Indizes kannst du die alten nochmal benutzen. Okay, das Beispiel ist blöd, aber ein bisschen was geht immer, gerade bei geschlossenen Körpern (Menschen, Bäume, Bananen, etc).

Mit glDrawArrays mußt du deine Geometrie so im Speicher anordnen, daß alles in einem Rutsch paßt. Mit Indizes bist du freier. Und ganz wichtig: die Vertex Caches moderner Grafikchips funktionieren nur mit indizierter Geometrie.

Hoffe geholfen zu haben ;)

Simon
2003-02-13, 20:01:44
Hallo,

ok, der Sinn ist mir jetzt klar :)
Aber wie erstell ich die jetzt passend??
Also ich hab meine Vertices in p_vertices und ein array mit unsigned ints ... wie krieg ich jetzt da die Indices zu??

Gibt's denn keine Anleitung/Tutorial/Beispiel dafür?


bye Simon

zeckensack
2003-02-14, 17:30:09
Sind evtl die unsigned ints schon deine Indizes? ;)

Du hast ja gesagt, daß du bisher glDrawArrays benutzt. Dann hast du die Nummer mit 'Zeiger aufs Vertex-Array setzen' ja schon erledigt.

Die Indizes sind jetzt ein Array von Integern (unsigned short oder unsigned int bieten sich an), die der Reihe nach angeben, welcher Vertex dran ist.

Ergo
GLuint indices[]={0,2,1,0,4,3,5,7,1,2,4,17,12,tatütata ...};

//vertex pointer setzen etc
glDrawElements(GL_TRIANGLES,21,GL_UNSIGNED_INT,indices);

Damit werden 21 Indizes geholt, die Vertices mit dieser Nummer aus dem Array gelesen und an GL 'verfüttert'. Um am Beispiel zu bleiben, erst Nummer 0, dann #2, #1, wieder #0, #4, #3, #5, blablabla :)

Daraus werden dann Dreiecke gebastelt, in unserem Fall exakt sieben Stück. Alle anderen primitives wie strips, fans und quads sind selbstredend auch erlaubt. Parameter #2 gibt dabei immer an, wieviele Indizies (=wieviele Vertices) geholt werden, nicht wieviele komplette primitives erstellt werden.

Die beiden restlichen Parameter sind der Datentyp der Indizes, und der Zeiger auf das zu benutzende Index-Array. Wenn ich statt 'indices' 'indices+5' (aka &(indices[5]) ) geschrieben hätte, hätte er mit Vertex #3 angefangen.

Und so :)

Simon
2003-02-14, 20:02:49
Hallo,

ich glaub, ich habs jetzt verstanden. Die Indices sind also nur Nummern, die angeben, in welcher Reihenfolge die Vertices aufgerufen werden.

Das war ja einfach :D

Danke :)

Unregistered
2003-03-09, 18:32:36
Originally posted by zeckensack
Und ganz wichtig: die Vertex Caches moderner Grafikchips funktionieren nur mit indizierter Geometrie.

Doofe Frage:
In den Unterlagen der "SIGGRAPH 98: Programming with OpenGL: Advanced Techniques" steht irgendwie das Gegenteil drin :/
Hat sich das in den letzten 5 Jahren geändert?

Demirug
2003-03-09, 19:06:44
Originally posted by Unregistered


Doofe Frage:
In den Unterlagen der "SIGGRAPH 98: Programming with OpenGL: Advanced Techniques" steht irgendwie das Gegenteil drin :/
Hat sich das in den letzten 5 Jahren geändert?

Es gibt zwei Arten von Vertexcaches. Einen vor den Vertexshadern und einen nach den Vertexshadern. Zeckensack bezog sich mit seiner Aussage auf den nach dem Vertexshader.

Der Cache vor dem Vertexshader mag es wenn die Daten linear kommen. Der Cache nach den Vertexshader mag es wenn die Verticens schnell wieder benutzt werden.

Aus diesem Grund sieht einen Ideale Indexliste wie folgt aus.

Die Indexnummern sind primär aufsteigen möglichst ohne Lücken. Rücksprünge auf bereits benutzte Verticen sollten innerhalb der grösse des Post-Vertex-Caches erfolgen.

Gut ist also zum Beispiel folgendes: 1,2,3,2,3,4,5,...

Schlecht ist: 1,300,100,400,200,500,....,300,400,...

Da man sich aber sowas bei Geometrie mit ein paar K Vertexdaten nicht mehr von Hand antun möchte gibt es tools dafür.

liquid
2003-03-11, 20:47:23
Eine Frage, ich weiß dass es bei OpenGL.org ziemliche viele SigGraph Papers gibt, aber gibts noch mehr freie davon im Netz? Bei SigGraph selbst gibt es ja diese digitale Bibliothek, allerdings muss man dafür löhnen, wenn man die nutzen will.
Gibts denn freies Material nicht umsonst im Netz oder ist das wirklich ALLES kostenpflichtig. Und wie verhält sich das bei dem Material auf OGL.org, warum darf das in die Öffentlichkeit gestellt werden?

cya
liquid