Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
ich bin grad dabei VBOs in mein Programm einzubauen. Um das alles n bisl einfacher zu gestalten, hab ich mir das in ne extra Klasse gekapselt. Aber ich hab noch 2 Sachen womit ich nich klar komm:
1. ich habe 20.000 verschiedene "WriteBufferData"-Prozeduren, die funktionieren auch, aber das sieht etwas unschön aus, also wollt ich die alle in eine Prozedur kapseln (procedure TVertexBufferObject.WriteBufferData(Data: Pointer; VertexType, Usage: Cardinal)) Da wird aber irgendwie der Pointer net weiter gegeben?! die ganzen Variablen haben die richtigen werte, das hab ich schon mit den anderen Prozeduren verglichen...
2. beim direkten schreiben in den Speicher erhalt ich beim schließen des Programms eine zugriffsverletzung. Und das Quad wird auch nich gerendert.
wäre net wenn sich das ma jmd ansehen könnte, code folgt...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Code:
VBO.WriteBufferData(@Vertex, GL_T2F_V3F, GL_STATIC_DRAW);//geht nich, Quad wird nich gezeichnet...
Das funktioniert deswegen nicht, weil du ein dynamisches Array hast. Ein dynamisches Array ist eigentlich nur ein Pointer und die Variable Vertex zeigt in diesem Falle lediglich auf den Speicherbereich an dem sich die Daten in Wirklichkeit befinden. Wenn du also sagst @Vertex übergibst du lediglich die Adresse der Variable Vertex. Und die befindet sich auf den Stack (wo andere Variablen, Rücksprungadressen etc liegen). Und da rein zu schreiben würde mit Sicherheit sehr sehr hässlich enden. Im Falle von dem @Operator (oder auch var und const Parametern) musst du dem Kompiler bewusst sagen, dass du die Daten haben willst. Also @Vertex[0]. Damit meinst du unmissverständlich den ersten Eintrag aus dem Array. Das gleiche gilt für Strings. Das sind auch fast nur dynamische Arrays of char. Genau das Gleiche musst du auch bei Stream.Read/Write beachten.
Ich habe mir bei so etwas angewöhnt wirklich grundsätzlich IMMER genau die Stelle anzugeben die ich haben will. Selbst bei statischen Arrays wo die Variable wirklich auf den Speicher zeigt.
Zitat:
2. beim direkten schreiben in den Speicher erhalt ich beim schließen des Programms eine zugriffsverletzung. Und das Quad wird auch nich gerendert.
Die Berechnung deines Speicheroffsets ist falsch.
Code:
inc(PInteger(fActiveAdressPointer),SizeOf(TVertexT2fV3f));//Pointer erhöhen, um so auf nächsten Vertex zu zeigen
Du setzt damit den Pointer nicht auf das nächste Vertex sondern du überspringst 3 Vertices. Inc hat eine Besonderheit. Es erhöht Zahlen um 1. Bei Pointern allerdings um die Größe des Types, auf welchen der Pointer zeigt. In deinem Falle castest du auf PInteger, damit zeigt der Pointer auf 4 Bytes Speicher und inc(PIntger) erhöht den Pointer um 4 Bytes. Würdest du auf PByte casten, dann würde der Pointer auf 1 Byte Speicher zeigen und inc(pByte) würde die Adresse nur um 1 erhöhen.
Wenn du also einen Pointer "Vertex: PVertexT2fV3f" hättest, dann würde es genügen "inc(Vertex)" zu machen. Da Inc per Default die Größe berücksichtig und um 1 erhöht landest du genau auf dem nächsten Eintrag. Kannst du die Pointer nicht so typisieren, dann musst du einen Typen benutzen der auf 1 Byte Speicher zeigt. Also "Inc(PByte(Vertex), SizeOf(TVertexT2fV3f))".
PS: Wenn du Pointer auf Records benutzt, dann solltest du diese auch direkt als Typen deklarieren. Denn wenn du Lokal eine Variable vom Typ ^Blah erstellst, dann kann es mitunter vorkommen, dass Delphi rumzickt. Entsprechend oben PBlah = ^TBlah definieren und bei Pointerbenutzung dann PBlah verwenden. Dann gibts auch keine Probleme.
Soweit ich weiß wäre die Berechnung des Offsets in Delphi korrekt - unter Freepascal jedoch nicht,
da es wie C Pointerarithmetik unterstützt.
Absolut sicher wäre die Schreibweise "someFloatPointer[i]" - welche unter Delphi nicht kompilierbar ist
und unter FPC auf jeden Fall den richtigen Offset berechnet.
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Tschuldigung, ich habe nicht mitgekriegt, dass die ursprüngliche OffSet-Berechnung des Threadstarters gemeint war. Was ich meinte, war natürlich, dass Lossys Angaben stimmen, und sowohl in Delphi als auch in FPC funktionieren. *Inc/Dec* berücksichtigt bei typisierten Pointern immer die Größe der jeweiligen Type.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
HI,
Problem 2 wäre damit gelöst:
Code:
inc(PVertexT2fV3f(fActiveAdressPointer));
aber beim 1. Problem komm ich immer noch nich weiter. wenn ich @vertex[0] übergeb kommt ne Zugriffsverletzung...
Ich hab das genau so wie in dem Tutorial gemacht, nur das ich den Pointer meiner Daten ein Prozeduraufruf weiter oben übergeb. wenn ich die Daten ansich übergeb, un dann erst bei glBufferDataARB den Pointer gehts?! das ist aber unpraktich, weil ich dann die 12 verschiedenen Prozeduren brauche und das wollt ich mit der Pointer-Sache eig. umgehen...
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Es kann sein, dass sich das Array genau an dieser Stelle rächt. Denn die Informationen des Arrays liegen nicht bei den Daten. Auf der einen Seite musst du den Pointer der Daten übergeben und auf der anderen Seite brauchst du auch die Nutzdaten des Arrays. Also die Länge.
Alternativ würde mir einfallen, dass du den Pointer auf die Daten übergibst und zusätzlich die Länge (Anzahl Vertices) als Parameter. In der Methode rechnest du dann noch die Größe aus und übergibst das. Sollte ausreichen.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.