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

Aktuelle Zeit: Sa Jul 19, 2025 02:33

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 36 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: vertex arrays...
BeitragVerfasst: Di Dez 08, 2009 21:36 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hi,

diesmal habe ich ein paar Fragen zu vertex arrays... also ich habe meine Daten wie folgt vorliegen:

Code:
  1.  
  2. -2.333692e-001  9.723002e-001 -1.307902e-002
  3.  5.246328e+001  6.316866e-001  2.853668e+000
  4.  5.292091e+001  8.544623e-001  2.861922e+000
  5.  5.255380e+001  6.668465e-001  3.852406e+000
  6.  


Dabei ist die erste Zeile eine normale und die andern drei sind die eckpunkte der dreiecksfläche.
ich kann mir das jetzt in eine stringlist laden und von da aus vermutlich auch wieder irgendwie rendern... ich habe das testweise mal aus eine listbox versucht... aber bei größeren modellen wurde das schnell träge.

Das "Tutorial Vertexbufferobject" habe ich leider nicht so gut verstanden um es umsetzen zu können...
Deshalb würde ich - auch fürs eigene Verständnis - gern ersteinmal mit "normalen" vertexarrays probieren... nur leider habe ich keine ahnung wie :)
Kann mir jemand einen anfängerfreundlichen Tipp geben oder mich auf ein Tutorial leiten, das nicht ganz so für fortgeschrittene ist wie Tutorial Vertexbufferobject?

wäre wirklich nett!

Danke

Wölfchen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 08, 2009 22:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Versuch das:
http://wiki.delphigl.com/index.php/Vertexarray
:)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Di Dez 08, 2009 22:44 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Philip hat geschrieben:


Das klingt super, aber ich bin nicht gut genug um das von C in Delphi zu übersetzen :( gibt es auch eine "Umsetzung in Delphi" davon?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 09:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Eine direkte Umsetzung nach Delphi würde dir auch nicht wirklich viel nützen. Aber ich versuche mal dir dir Wichtigen Punkte zu erklären.

Als erstes "benötigst" du ein Record in welchem du deine Daten ablegen willst. Benötigt man zwar nicht wirklich aber macht die Arbeit ungemein leichter. Du benötigst dort Normale und VertexDaten.
Code:
  1. type
  2.   TVertex = record
  3.     NormX, NormY, NormZ: TGLfloat;
  4.     VertX, VertY, VertZ: TGLfloat;
  5.   end;


Als nächsten Schritt benötigst du ein Array von diesem Record. Ich persönlich bevorzuge echte per Hand erstellte Speicherbereiche auf die ich dann Mittels Pointer zugreife. Wenn man zu viel mit Arrays rumwuselt habe ich immer mal wieder Probleme gehabt. Woher die Daten kommen ist relativ egal. Wichtig ist nur, dass die Daten an einem Stück im Speicher liegen.
Es wäre praktisch, wenn du vorher weißt wie viele Einträge du hast. Als Beispiel für eine Array mit 10 Vertices. Mit den Indizes 0-9 kannst auf die eintelnen Elemente zugreifen.
Code:
  1. var
  2.   VertexArray: Array of TVertex;
  3.  
  4. SetLength(VertexArray, 10);


Wenn du deine Daten aus der Textdatei in das Array gelesen hast, dann kannst du es zum Zeichnen benutzen. Dazu musst du mit glEnableClientState die Arrays aktivieren die du benutzen willst. In nahezu allen Fällen dürfte das GL_VERTEX_ARRAY einschließen. Du benötigst zusätzlich noch GL_NORMAL_ARRAY.

Für die aktivierten Arrays musst du noch festlegen woher OpenGL die Daten beziehen soll. Das geschieht mittels glVertexPointer, glNormalPointer etc. Die gl*Pointer Methoden haben alle den gleichen Aufbau. Die erstelle gibt an wie viele Komponenten der Typ hat. Eine 3 würde glVertex3* entsprechen. Eine 2 würde glVertex2* entsprechen.
Anschließend folgt der Datentyp in dem sich die Daten im Array befinden. Bei GLfloat im Record muss GL_FLOAT übergeben werden.
Der Dritte Parameter gibt an wie groß die einzelnen Elemente deines Arrays sind. Das ist wichtig, da er sonst nicht weiß, dass zwischen den vertexdaten noch Normalen sind (oder sonst was). Dort empfielt es sich für den Anfang SizeOf(TVertex) zu übergeben.
Der letzte Parameter ist ein Pointer auf Daten. Dort muss das Array übergeben werden. Aber als Besonderheit muss bei glVertexPointer ein Pointer auf den Anfang der Vertexdaten übergeben werden. Bzw bei glNormalPointer der Anfang auf die Normalendaten. Entsprechend muss man bei dem Anfangsarrayelement auf das einzelne Feld zugreifen. VertexArray[0].VertX. Da wir davon aber einen Pointer brauchen müssen wir mit dem @ Operator die Addresse erfragen. Fertig sieht das in etwa so aus.
Code:
  1. glVertexPointer(3, GL_FLOAT, SizeOf(TVertex), @(VertexArray[0].VertX));

Für die Normalen musst du bei glNormalPointer dann aber auch auf NormX zugreifen. Wenn du ab dem 6ten Vertex zeichnen willst kannst du auch als Startindex eine 5 übergeben. Dann würden die ersten 5 Vertices nicht gezeichnet. Denke aber daran, dass die Gesammtanzahl der noch verfügbaren Elemente dann kleiner wird. Also die die sich nach dem Startindex noch im Array befinden.

Zeichnen kannst du dann wie im Tutorial beschrieben mit glDrawElements oder einer vergleichbaren Funktion.

PS: *Argh* Irgendwie habe ich es mit dem Schreiben mal wieder übertrieben. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 09:32 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jan 31, 2007 18:32
Beiträge: 150
Programmiersprache: Pascal
So ich hab dir das ganze eben mal in Code der für dich verständlich sein sollte umgeschrieben... In dem Code von mir wird aber mit den Vertex-Arrays nur die Geometrie gezeichnet, im Wiki bekommen die Primitiven zusätzlich noch Farbe.... aber ich denke das zu übertragen sollte keine Problem sein.
Code:
  1.  
  2. type Vertex3f = record
  3.     X, Y, Z : Single;
  4. End;
  5.  
  6. const vertices : array[0..5] of Vertex3f = (
  7.     (X:0.0),(Y:0.0),(Z:0.0),
  8.     (X:0.0),(Y:0.0),(Z:1.0),
  9.     (X:1.0),(Y:0.0),(Z:0.0),
  10.     (X:1.0),(Y:0.0),(Z:1.0),
  11.     (X:2.0),(Y:0.0),(Z:0.0),
  12.     (X:2.0),(Y:0.0),(Z:1.0));
  13.  
  14. const indices : array[0..7] of GLuint = (
  15.     0, 2, 3, 1, 2, 4, 5, 3);
  16.    
  17.  
  18. const indexCount = 8;
  19.  
  20. procedure initVertexArray()
  21. Begin
  22.     glEnableClientState(GL_VERTEX_ARRAY);
  23.     glVertexPointer(3, GL_FLOAT, 0, @vertices[0]);
  24. // da die farben rausgelassen wurden ist der offset 0
  25. End;
  26.  
  27. procedure drawVertexArray()
  28. Begin
  29.     glDrawElements(GL_QUADS, indexCount, GL_UNSIGNED_INT, @indices);
  30.  // der zeiger fehlte in dem Beispiel im Wiki
  31. End;
  32.  


Am besten du schaust dir das hier auch noch an : glDrawElements

:/ da war wieder wer schneller :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 09:55 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Euch beiden erstmal vieeeeeeeeelen Dank für die Antworten, ich bin leider auf Arbeit und kann jetzt nix probieren, aber so beim lesen ging mir schon das ein oder andere schwach flackernde licht auf.


Meine Daten liegen immer so vor:
Code:
  1.  
  2. Normale XFloat YFloat ZFloat
  3. Vertex1 XFloat YFloat ZFloat
  4. Vertex2 XFloat YFloat ZFloat
  5. Vertex3 XFloat YFloat ZFloat


ich sortiere den kram so, das auch immer mit einer normalen angefangen wird. So steht das jetzt in meiner TextDatei bzw TStringList.
Was ich jetzt nicht ganz verstanden habe ist ob ich zwei getrennte arrays anlegen muss und in das eine nur die normalen schreibe und in das andere die vertexe oder ob alles in einem großen array liegen kann (oder sogar muß?)

Vielleicht sollte ich dazusagen, das ich sehr große Datenmengen haben werde, die ersten Testmodelle aus CAD haben mehrere zehntausend einzelflächen.

Schade das erst Mittwoch ist :(

Wölfchen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Achso ist das aufgebaut. In meinem Beispiel bin ich davon ausgegangen, dass du für jeden Vertex auch eine Normale hast. Gehe ich recht, dass du Pro Dreieck eine Normale hast?

Wenn ja, dann wäre es wohl das Einfachste du würdest die Normale auf alle drei Vertices zuweisen. Also im Endeffekt verdreifachen. Wenn du die Daten am Stück zeichnen willst gehts leider nicht anders. Wenn das nur eine Normale pro komplettem Objekt wäre, dann könntest du diese vor dem Zeichnen via glNormal3f setzen. Aber bei einer Normale pro Dreieck geht das leider nicht. Und wenn dann benötigt auch jeder Vertex eine eigene Normale. Selbst wenn die gleich wäre.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 11:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Was ich jetzt nicht ganz verstanden habe ist ob ich zwei getrennte arrays anlegen muss und in das eine nur die normalen schreibe und in das andere die vertexe oder ob alles in einem großen array liegen kann (oder sogar muß?)

Beides ist möglich. Alles in einem großen Array ist aber natürlich besser, da die Grafikkarte so schneller darauf zugreifen kann. Stichwort glInterleavedArrays.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 22:25 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Lossy eX hat geschrieben:
Achso ist das aufgebaut. In meinem Beispiel bin ich davon ausgegangen, dass du für jeden Vertex auch eine Normale hast. Gehe ich recht, dass du Pro Dreieck eine Normale hast?


Ja, da gehst du recht in der Annahme...


Lossy eX hat geschrieben:
Wenn ja, dann wäre es wohl das Einfachste du würdest die Normale auf alle drei Vertices zuweisen. Also im Endeffekt verdreifachen. Wenn du die Daten am Stück zeichnen willst gehts leider nicht anders. Wenn das nur eine Normale pro komplettem Objekt wäre, dann könntest du diese vor dem Zeichnen via glNormal3f setzen. Aber bei einer Normale pro Dreieck geht das leider nicht. Und wenn dann benötigt auch jeder Vertex eine eigene Normale. Selbst wenn die gleich wäre.


das hört sich jetzt irgendwie suboptimal an... bei einem mittelgroßen Beispielmodell von mir, würde sich dadurch die anzahl der normalen von 775904 auf über zwei millionen erhöhen... kann ich nicht sowas machen:

Code:
  1. TVertex = record
  2.     NormX, NormY, NormZ: TGLfloat;
  3.     Vert1X, Vert1Y, Vert1Z: double;
  4.     Vert2X, Vert2Y, Vert2Z: double;
  5.     Vert3X, Vert3Y, Vert3Z: double;
  6. end;


Noch eine Frage: Ich versuche gerade zu verstehen wie ich ein Array dieser Art dann befüllen kann... weil ich irgendwie immer in die Fehlermeldung
Zitat:
Exception der Klasse EStringListError mit der Meldung 'Listenindex überschreitet das Maximum (10824624)'aufgetreten
renne... (was wohl an meiner kranken Schleife liegt)

Dabei habe ich jetzt in kleinen Schritten mal so ein Array gefüllt, wenn ich aber anschliessend die Werte auslese, sind diese ungenau: aus einer glatten 3.3 wird irgendwie 3.29999901923876 und so... ist das normal? Kann oder muß ich dagegen was tun?

Danke schonmal im Voraus für eure Geduld mit mir :)

Wölfchen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 23:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
aus einer glatten 3.3 wird irgendwie 3.29999901923876 und so... ist das normal? Kann oder muß ich dagegen was tun?

Der Computer arbeitet im Binärsystem, nicht im Dezimalsystem. Eine 3.3 ist im Binärsystem keine glatte Zahl. In den meisten Fällen musst du nichts dagegen unternehmen. Wenn du allerdings Ergebnisse von Berechnungen vergleichst kann es sinnvoll sein eine gewisse Toleranz zu zulassen, zum Beispiel so:
Code:
  1. epsilon := 0.00001;
  2. if (x + epsilon >= 0) then ...


Code:
  1. TVertex = record
  2.     NormX, NormY, NormZ: TGLfloat;
  3.     Vert1X, Vert1Y, Vert1Z: double;
  4.     Vert2X, Vert2Y, Vert2Z: double;
  5.     Vert3X, Vert3Y, Vert3Z: double;
  6. end;

Alles einem Record geht nicht.
Was anderes: Bist du sicher das du double als Datentyp verwenden möchtest? Die Grafikkarte kann sowieso nur mit floats umgehen und es würde schon mal die Hälfte der Datenmenge einsparen.

Zitat:
Aber bei einer Normale pro Dreieck geht das leider nicht. Und wenn dann benötigt auch jeder Vertex eine eigene Normale. Selbst wenn die gleich wäre.

Genau genommen geht das (glaube ich jedenfalls), ist aber kompliziert. Wenn du für Position und Normale jeweils eigene Arrays verwendest, kannst du glaube ich auch jeweils ein eigenes Index-Array benutzen.

Allgemein sind Indizes ein guter Tipp bei solch großen Geometriemengen, falls du sie nicht bereits sowieso verwendest. Indizes reduzieren die Datenmenge drastisch, meist irgendwo zwischen 50 und 80%, liegt aber an deiner Anwendung.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Mi Dez 09, 2009 23:25 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Coolcat hat geschrieben:
Alles einem Record geht nicht.
schade...
Coolcat hat geschrieben:
Was anderes: Bist du sicher das du double als Datentyp verwenden möchtest? Die Grafikkarte kann sowieso nur mit floats umgehen und es würde schon mal die Hälfte der Datenmenge einsparen.
ich habe jetzt alles auf single umgestellt...


Coolcat hat geschrieben:
Allgemein sind Indizes ein guter Tipp bei solch großen Geometriemengen, falls du sie nicht bereits sowieso verwendest. Indizes reduzieren die Datenmenge drastisch, meist irgendwo zwischen 50 und 80%, liegt aber an deiner Anwendung.

Hört sich gut an, aber fürs erste will ich es mal irgendwie hinbekommen :) (hatte ich ja schon, aber träääääääääääge aus einer listbox heraus...) jetzt will ichs aus arrays raus rendern und wenn das läuft schau ich mir an wie ich die arrays optimieren kann...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Do Dez 10, 2009 00:04 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 19:15
Beiträge: 172
Und wenn du so weit bist, dass du einen Geometry Shader schreiben kannst, brauchst du beim Flat Shading nicht nur keine 3-fachen Normalen mehr angeben, sondern kannst deren Angabe komplett weglassen und sie statt dessen beim Zeichnen ausrechnen (im Geometry Shader). Dort hast du nämlich die Möglichkeit ein Programm auf der Grafikkarte auszuführen, dass sich die Eckpunkte von deinen Dreiecken anschaut und per Kreuzprodukt zweier Kanten die Normale dazu ausspuckt. Das spart dir dann wieder 50% bei der Datenhaltung. :wink:

P.S.: Mal so aus Neugierde - was ist denn das für ein riesiges 3D-Objekt mit so vielen Punkten, dass du komplett flach rendern möchtest? OpenGL kann zum Beispiel auch ein 'smoothes' Modell mit einem einzigen Kommando flach darstellen, wenn du irgendwann beide Möglichkeiten im Programm haben möchtest. (Und zwar ohne Shader und Schnickschnack ^^)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Do Dez 10, 2009 16:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Geometry Shader

*hust*...dies ist das Einsteiger-Forum....

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Do Dez 10, 2009 22:25 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Ich erinnere mich, vor kurzem hier einen Forenpost zum Thema GUI geschrieben zu haben, in dem ich nur n paar Dinge geklärt haben wollte. Da hat TAK mich auch gleich mit einer längeren Abhandlung erschlagen :D
Ich find das aber okeh, warum sollte man Einsteigern nicht schonmal einen Einblick in das verpassen, was so möglich ist - das motiviert.

Wo ich gerade auf meinen Forenpost anspiele, und der Verfasser dieses Threads sich auch dahingehend geäußert hat, dass das VBO (und meiner Meinung nach auch das FBO) -Tutorial verständlicher sein könnte...steht vllt. ne Überarbeitung in Aussicht? :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: vertex arrays...
BeitragVerfasst: Do Dez 10, 2009 23:53 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
NerdIII hat geschrieben:
Und wenn du so weit bist, dass du einen Geometry Shader schreiben kannst, brauchst du beim Flat Shading nicht nur keine 3-fachen Normalen mehr angeben, sondern kannst deren Angabe komplett weglassen und sie statt dessen beim Zeichnen ausrechnen (im Geometry Shader). Dort hast du nämlich die Möglichkeit ein Programm auf der Grafikkarte auszuführen, dass sich die Eckpunkte von deinen Dreiecken anschaut und per Kreuzprodukt zweier Kanten die Normale dazu ausspuckt. Das spart dir dann wieder 50% bei der Datenhaltung. :wink:

hmm, hatte ich erwähnt das ich sowohl delphi, als auch OpenGL Anfänger bin, ohne großartig andere Programmierkenntnisse? :) aber ich werde gegebenenfalls nochmal darauf zurückkommen :roll: :mrgreen:
NerdIII hat geschrieben:
P.S.: Mal so aus Neugierde - was ist denn das für ein riesiges 3D-Objekt mit so vielen Punkten, dass du komplett flach rendern möchtest? OpenGL kann zum Beispiel auch ein 'smoothes' Modell mit einem einzigen Kommando flach darstellen, wenn du irgendwann beide Möglichkeiten im Programm haben möchtest. (Und zwar ohne Shader und Schnickschnack ^^)


Sind einfach CAD Daten, alles Mögliche... ich weiss ja noch nicht, was alles damit machbar ist... dieweil ich ja schon froh bin wenn ich sie geladen und dargestellt bekommen :roll: Was ich jetzt zwar schon ganz ansehnlich hinbekomme aber immernoch nicht so, dass ich wirklich sagen würde: Geil, so kanns bleiben...

zoiX hat geschrieben:
Wo ich gerade auf meinen Forenpost anspiele, und der Verfasser dieses Threads sich auch dahingehend geäußert hat, dass das VBO (und meiner Meinung nach auch das FBO) -Tutorial verständlicher sein könnte...steht vllt. ne Überarbeitung in Aussicht?
das habe ich zwar so nicht gemeint, aber wenns das mal leichter verdaulich gäbe wäre ich schon froh :)



So jetzt noch eine Frage:

Mein Errorhandler gibt mir den Fehler "invalid Operation" zurück, aber mein prgramm funzt und die Modelle sehen auch normal aus... Ich habe versucht alles mögliche auszukommentieren, was mit GL zu tun hat aber die Fehlermeldung bleibt beharrlich...

was könnte das sein?

Gruß

Wölfchen


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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 | 15 Queries | GZIP : On ]