Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:53

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 09:28 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Hey Leute :)

Ich habe schon seit längerm ein Problem mit Vertex Arrays bzw. dem Texturmapping!
Angefangen mit dem Thema habe ich auf der Seite:
http://www.songho.ca/opengl/gl_vertexarray.html

3D Objekte rendern ist alles kein Problem aber mein Punkt der mir Kopfzerbrechen bereitet ist folgender:
glTexCoordPointer()

Wie zum Teufel soll das gehen? :shock:

Ich habe z.b ein Array für die Geometrie, für die Texturkoordinaten, Normals, Index usw.
Damit kann ich ohne Probleme das 3D Model laden und die Texturkoordinaten habe ich auch aber wie bestimme ich die Textur die rauf kommt???

So wie ich das sehe wird das Array ja einfach abgearbeitet und das wars...

Aktuell lege ich die Textur mit glBindTexture(...) und glTexParameteri(...) fest aber dann wäre ja überall die gleiche Textur!
Wie kann ich das am besten lösen?

Edit// Irgendwie kam mir gerade eine Idee :lol:
Soll man das Array einfach immer nur soweit abarbeiten bis eine neue Textur kommt, diese dann einbindet und dann gehts quasi von dem Punkt wo man aufgehört hat weiter?
Bei glDrawArrays kann ja beim 2. Parameter der Startwert bzw. 3. Parameter der Endwert definiert werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 10:16 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Ja, das sollte gehen. Einfach die neue Textur binden und weiterrendern. Hat aber den Nachteil, dass du die Offsets wissen musst, ggf ist es sinnvoller, pro Material einfach eigene Arrays zu erstellen. Dürfte ja nicht viel Zeit kosten.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 11:38 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Klingt allerdings auch nicht sehr schnell...

Was ist denn von der Geschwindigkeit her besser: Displaylists oder Vertex Arrays?
Die Vor- und Nachteile mal außen vorgelassen!


Edit// Hab nun auch öfters gelesen, dass Displaylists bei ATI/AMD Karten ziemlich langsam sind - also im Vergleich zu nvidia!
Kann auch bestätigen das meine 3D Anwendung ziemlich schnell mit Displaylists einbricht! Werd ich mal auf einer nvidia Testen was da dran ist.
Kann man einer Displaylist auch bei ATI/AMD auf die Sprünge helfen oder hilft da nur VBO, VOA etc.?!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
VBOs dürften, bei Geschickter verteilung der Vertices (bzgl. Texturnutzung) das schnellste sein, was du bekommen kannst.
Displaylisten werden je nach Treiber auch zu VBOs optimiert, wenn das möglich ist.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 13:23 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Okay danke für die Info!
Naja ich wollte meine Displaylists ohnehin zu VBO's abändern. ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 17:08 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Wie du die Textur wechselst hast du ja selbst herausgefunden, mit den Texturkoordinaten hab ich aber selbst keine Idee, da musste die Textur entsprechend Geschickt einsetzen / bearbeiten / erstellen.



Hat alles seine Vor- und Nachteile.

Vorteile:
VAO :
Vertexdaten werden im Hauptspeicher abgelegt --> der RAM der Grafikkarte wird entlastet,
lassen sich leichter bearbeiten,
schneller als glBegin() und glEnd()

VBO :
Vertexdaten werden im RAM der Grafikkarte abgelegt --> schneller
schnellste Methode

Displaylisten :
flexibler, da diese z. B. Manipulationen an der Matrix und den "states" enthalten können


Nachteile:
Das die Vorteile der anderen Methoden fehlen.
Bei Displaylisten kommt als Nachteil noch hinzu das es "deprecated", also veraltet ist und daher nicht mehr als Kernfunktion zur Verfügung steht (deine Grafikkarte / Treiber KANN diese Funktion allerdings dennoch unter Umständen unterstützen, muss es aber ab 3.x NICHT MEHR).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
SDH.Prod hat geschrieben:
VBO :
Vertexdaten werden im RAM der Grafikkarte abgelegt --> schneller
schnellste Methode

Displaylisten :
flexibler, da diese z. B. Manipulationen an der Matrix und den "states" enthalten können


Das kann man so leider nicht stehen lassen. Displaylisten können nachträglich NICHT mehr geändert werden, die States werden während des Erstellens in die Displaylisten kompiliert. Ist diese erstmal im VRAM kann man an ihr nur noch via Shader etwas ändern.

Anders VBOs, dort gibt es spezielle Flags (Stream, Read-only, etc.) mit denen man VBOs auch effizient zur Laufzeit verändern kann.

Und zum Thema Distplaylisten gegen VBO :
Auf aktuellen Karten spielt das keine Rolle. Es ist schon lange so dass Treiber Displaylisten intern als VBOs ablegen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 17:54 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Das war ja schonmal sehr Informativ hier :)

Ich habe gerade mal etwas ganz billiges via VA versucht doch es wird einfach nix gerendert, was ich gerade nicht verstehen will.
Code:
  1.     GLfloat test[] = {
  2.         10.0f, -10.0f, 0.0f,
  3.         -10.0f, -10.0f, 0.0f,
  4.         10.0f, 10.0f, 0.0f,
  5.         -10.0f, 10.0f, 0.0f };
  6.  
  7.     glEnableClientState(GL_VERTEX_ARRAY);
  8.     glVertexPointer(3, GL_FLOAT, 0, test);
  9.         glDrawArrays(GL_TRIANGLE_STRIP, 0, 11);
  10.     glDisableClientState(GL_VERTEX_ARRAY);


Kann mir da zufällig mal jemand schnell sagen woran das liegt?!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 18:58 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Zunächst einmal ist der letzte Parameter von glDrawArrays "count", also Anzahl und nicht "der höchste Index". Dein Array enthält 12 floats, welche 4 Vertices darstellen, darum muss auch count = 4 sein wenn du das komplette Array zeichen willst.

Dann ist deine Modelview- und deine Projektionsmatrix uns unbekannt.
Ist die Modelviewmatrix = Identity und deine Projektionsmatrix eine durch glFrustum oder gluProjection erzeugte Matrix, dann kannst du wegen dem Z-Wert nichts sehen, da dein "3-Eck-Modell" vor der Nahclipping-Ebene liegt. glTranslatef(0.0f, 0.0f, -1.0f); würde das Problem lösen, allerdings sind deine 3-Ecke fast schon zu groß (sehen würdest du aber dennoch etwas).
Für den Fall das du Orthogonale Projektion benutzt ohne Transformationen: überprüfe die Parameter.

Dein Array zeichnet übrigens 2 Dreiecke, wovon das erste durch "Backfaceculling" "unsichtbar" wird.



An Sascha: wie kann man Displaylisten mit Shader manipulieren? O.o


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 19:24 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Okay habs auf 4 geändert aber geht trotzdem nicht.

Die anderen Sachen schließe ich alle aus.
Ich habe hier kein 50 Zeilen Projekt sondern schon ein paar Tausend wo Kamerasteuerung usw. integriert ist.
Mit Displaylists, glBegin/glEnd seh ich es ohne Probleme aber bei dem DrawArray kommt da nix.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 19:42 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Ich habe es mal in mein Projekt eingefügt. Bei mir zeichnet es ohne Probleme.

Sonst wäre da noch "Farbe = Hintergrundfarbe"?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Di Aug 09, 2011 20:18 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Hab ich auch schon überprüft, führt zu keinem Ergebnis.
Ahja wegen dem Matrixmode:
Erst glMatrixMode(GL_PROJECTION) (für Clipping einstellen etc.) und danach einfach Modelview - also glMatrixMode(GL_MODELVIEW).

Ich werd wohl mal kurz ein neues Projekt erstellen und schauen obs da läuft... wenn du sagst es geht bei dir wirds schon so sein :?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Mo Aug 15, 2011 10:40 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Funktioniert es denn nun?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Do Aug 18, 2011 20:23 
Offline
DGL Member

Registriert: Di Aug 09, 2011 07:33
Beiträge: 163
Programmiersprache: C/C++
Jap klappt... kann mir zwar noch nicht so ganz erklären warum aber ok, sei mal dahingestellt.

Ich hätte nochmal eine Frage zu den Displaylists. Jetzt mal ganz allgemein, wie viel Polygones sollte so eine Displaylist rendern können mit aktueller Hardware?
Ich habe leider das Problem, dass meine Performance bei 50.000 deutlich einbricht und das kann ja eig. nicht sein.. oder?! :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Vertex Arrays
BeitragVerfasst: Fr Aug 19, 2011 09:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Es gibt kein Magischen Wert. Früher war es 1024, auf einigen 2048 vertice und das steigt mit jeder gpu generation. Das liegt am Cache, die Performance kommt aus dem vertex cache, welcher n Vertice aufnehmen kann und je weniger zugriffe ausserhalb dieser Vertice passiert des so schneller. Also es ist viel mehr wichtiger die vertice in richtiger reihenfolge in den speicher zu packen und eine displaylist drüber zu packen, statt einen magische Anzahl für die Displaylist zu suchen, denn die ist jedes mal anders, je nach dem wieviele cache misses auftreten und die performance vom buffer zunichte machen.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 23 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]