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

Aktuelle Zeit: Mi Jul 16, 2025 19:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: glMultiDrawElements will nicht mehr
BeitragVerfasst: Sa Mär 24, 2012 13:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich entwickel zur Zeit mit Lazarus64. Weil ich nicht alles neu schreiben will hab ich mir einige Units aus meinen Delphi-Projekten kopiert. Seltsamerweiße funktioniert das bei Lazarus nicht so, wie es sollte:
Code:
  1. procedure TgloPlane.Render(RenderModes: TRenderModes = []);
  2. var
  3.   len, i: Integer;
  4.   error: glEnum;
  5. begin
  6.   inherited Render(RenderModes);
  7.  
  8.   if (rmLight in RenderModes) then
  9.     glNormal3f(0, 1, 0);
  10.  
  11.   fVBO.Bind;
  12.   fIDArray.Bind;
  13.  
  14.   glEnableClientState(GL_VERTEX_ARRAY);
  15.   glVertexPointer(3, GL_FLOAT, 20, Pointer(0));
  16.  
  17.   if rmTexture in RenderModes then begin
  18.     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  19.     glTexCoordPointer(2, GL_FLOAT, 20, Pointer(12));
  20.   end;
  21.  
  22.   glEnableClientState(GL_INDEX_ARRAY);
  23.   glIndexPointer(GL_UNSIGNED_INT, 0, nil);
  24.  
  25.   len := Length(fIndexArr) div 2;
  26.   glMultiDrawElements(GL_QUAD_STRIP, @(fIndexArr[0]), GL_UNSIGNED_INT, @(fIndexArr[len]), len);
  27.   error := glGetError();
  28.   LogMsg(IntToStr(error));
  29.  
  30.   //for i := 0 to len-1 do
  31.   //  glDrawElements(GL_QUAD_STRIP, fIndexArr[i], GL_UNSIGNED_INT, Pointer(fIndexArr[len+i]));
  32.  
  33.   glDisableClientState(GL_VERTEX_ARRAY);
  34.   glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  35.   glDisableClientState (GL_INDEX_ARRAY);
  36.  
  37.   fIDArray.Unbind;
  38.   fVBO.Unbind;
  39. end;

fIndexArr enthält im untern Teil die Anzahl der zu rendernden Elemente und im oberen Teil den Offset im IndexBuffer. Das Objekt wird nicht gezeichnet und glError spuckt GL_INVALID_ENUM aus. Seltsamerweiße funktioniert der Code genau so wie er dort steht mit Delphi?! Und wenn ich das Ganze mit einer Schleife und glDrawElements zeichne (siehe auskommentierter Code) dann funktioniert es auch. Hat jmd ne Idee warum sich das so seltsam verhält?! Integer (und damit auch GLsizei) ist bei Lazarus bzw. FPC und 64bit trotzdem nur 32Bit lang. Könnte das vlt. daran liegen?

MfG & Thx Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 24, 2012 18:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Integer (und damit auch GLsizei) ist bei Lazarus bzw. FPC und 64bit trotzdem nur 32Bit lang. Könnte das vlt. daran liegen?

Integer sind auf x86_64 Platformen eigentlich immer 32bit, also das ist normal. Lediglich die Speicherverwaltung ist 64bit...also ein Pointer ist 64bit groß. Probleme gibt es eigentlich nur wenn irgendwo jemand die bekloppte Idee hatte einen Pointer brutal zu einem Integer zu casten (etwa eine Library der man einen 32bit-Integer als "UserData" mitgeben kann).

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Mär 24, 2012 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich benutz ja keine Libs (außer OpenGL halt), die Units sind alle von mir. Ich hab bei meinen alten 32Bit Programmen öfter Pointer auf Integer und umgedreht gecastet, aber in den Units um die es hier geht ist das nicht der Fall. FPC zeigt mir da auch keine Warnung an, was es machen würde, wenn man Pointer auf Integer castet.
Ich find den Fehler auch seltsam. Im Wiki steht: GL_INVALID_ENUM - mode enthält keinen gültigen Wert. Ich hab aber ganz normal GL_QUAD_STRIP übergeben. Bei glDrawElements funktioniert es ja....

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 25, 2012 10:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
GLsizei sollte allerdings auch so groß sein wie ein Pointer. Wenn du nebenbei Typen brauchst, um Pointer <-> Integer zu casten, kann ich nur PtrInt und PtrUInt empfehlen (ersteres mit, letzteres ohne Vorzeichen). Die haben immer die Größe eines Pointers.

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  
BeitragVerfasst: So Mär 25, 2012 10:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Tritt der Fehler vielleicht schon vorher auf? glGetError gibt dir immer den letzten Fehler der aufgetreten ist.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 25, 2012 12:04 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

@Lord Horazont: ich hab jetzt anstatt GLsizei mal Int64 genommen, aber es geht trotzdem nicht. Die PtrInt-Typen kenn ich schon, und seitdem ich mit Lazarus 64bit entwickel benutz ich die auch wenn es mal nötig ist :)

@Coolcat: Hattest Recht, der Fehler kommt vorher. Und zwar bei glIndexPointer(GL_UNSIGNED_INT, 0, nil); glIndexPointer will dort ein GL_INT haben. Seltsamerweiße gibts es bei glMultiDrawElements aber nur GL_UNSIGNED_INT als Wert für die Indizes :?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 25, 2012 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Wenn du sowieso 32bit pro Farbindex benutzt, wäre es dann nicht sinnvoller gleich einen RGBA-Wert zu speichern? (Ggf. reichen sogar 24bit RGB)

Zitat:
glIndexPointer will dort ein GL_INT haben. Seltsamerweiße gibts es bei glMultiDrawElements aber nur GL_UNSIGNED_INT als Wert für die Indizes :?

Hier geht es um was anderes, glIndexPointer behandelt Farbindices! Also nicht Vertexindices!

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 25, 2012 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Sicher das glIndexPointer nur für die Farbe gilt? Weil meine Vertices auch indiziert gezeichnet werden. Zumindest hab ich das im VBO so berechnet und das Ergebnis hat (bis jetzt) ja auch immer gestimmt...

Code:
  1. //////////////////////////////////////////////////////////
  2. //aktualisiert das VBO
  3. procedure TgloPlane.UpdateVBO;
  4.  
  5. type
  6.   TVertex = packed record
  7.     X, Y, Z, S, T: glFloat;
  8.   end;
  9.   PVertex = ^TVertex;
  10.  
  11. var
  12.   x, y, i, c: Integer;
  13.   v: TVertex;
  14.   p1: PVertex;
  15.   p2: PglInt;
  16.  
  17.   procedure WriteP1;
  18.   begin
  19.     if c < fVBO.DataCount then begin
  20.       p1^ := v;
  21.       inc(p1);
  22.       inc(c);
  23.     end;
  24.   end;
  25.  
  26.   procedure WriteP2(i: Integer);
  27.   begin
  28.     if c < fIDArray.DataCount then begin
  29.       p2^ := i;
  30.       inc(p2);
  31.     end;
  32.   end;
  33.  
  34. begin
  35.   if fVDivs <= 0 then
  36.     fVDivs := 1;
  37.   if fHDivs <= 0 then
  38.     fHDivs := 1;
  39.  
  40.   SetLength(fIndexArr, 2*fVDivs);
  41.   for i := 0 to fVDivs-1 do begin
  42.     fIndexArr[fVDivs+i] := 2*(fHDivs+1)*SizeOf(gluInt)*i;
  43.     fIndexArr[       i] := 2*fHDivs+2;
  44.   end;
  45.  
  46.   fVBO.InitDirectWrite((fHDivs+1)*(fVDivs+1), SizeOf(TVertex), GL_STATIC_DRAW);
  47.   p1 := fVBO.StartAdress;
  48.   v.Y := 0;
  49.   c := 0;
  50.   for y := 0 to fVDivs do begin
  51.     v.X := (y/fVDivs - 0.5);
  52.     v.S := y/fVDivs;
  53.     for x := 0 to fHDivs do begin
  54.       v.Z := (x/fHDivs - 0.5);
  55.       v.T := x/fHDivs;
  56.       WriteP1;
  57.     end;
  58.   end;
  59.   fVBO.FinishDirectWrite;
  60.  
  61.   fIDArray.InitDirectWrite((2*fHDivs+2)*fVDivs, SizeOf(gluInt), GL_STATIC_DRAW);
  62.   p2 := fIDArray.StartAdress;
  63.   c := 0;
  64.   for y := 0 to fVDivs-1 do begin
  65.     for x := 0 to fHDivs do begin
  66.       for i := 1 downto 0 do begin
  67.         WriteP2(x + (fHDivs+1)*(i + y));
  68.       end;
  69.     end;
  70.   end;
  71.   fIDArray.FinishDirectWrite;
  72. end;

Im VBO werden die Vertices nur einmal abgelegt, also hab ich genau (fHDiv+1)*(fVDiv+1) Vertices. Danach wird nur noch der Index der Vertices berechnet. Ich hab da auch irgendwann mal den Speicherverbrauch berechnet, und wenn ich mich richtig erinner, dann hat man schon bei einer Ebene von 2x2 Vertices weniger belegten Speicher, als wenn man die Vertices so in das VBO legt, wie sie gezeichnet werden.

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Zuletzt geändert von Lord Horazont am Mo Mär 26, 2012 17:58, insgesamt 1-mal geändert.
/// entfernt, scrollbalken!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 25, 2012 20:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Den Pointer für den Indexbuffer bekommt glMultiDrawElements...sonst würdest du ja glMultiDrawArrays benutzen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mär 25, 2012 21:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Du verwirrst mich grad :? Der IndexBuffer hat keinen Pointer, das is ein BufferObject (um genau zu sein ein GL_ELEMENT_ARRAY_BUFFER) und demzufolge liegen die Daten auch auf der Graka. Dem glMultiDrawElement geb ich über den Zeiger nur ein Daten-Offset im IndexBuffer mit auf dem Weg.

€: Okay, glIndexPointer is wirklich nur für Farbindices. Ich dachte immer das man das benutzt um GL_ELEMENT_ARRAY_BUFFER zu initialisieren, ähnlich wie man das bei nem VBO auch macht...

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 26, 2012 18:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ne. Sobald der Index Buffer gebunden ist, wirken gl*DrawElements auf den Indexbuffer (also die Pointert-Argumente). Das ist genauso wie mit gl*Pointer und VBOs: Wenn der entsprechende Client-State aktiv ist, wirken die gl*Pointer-Aufrufe relativ zum VBO und nicht als absolute Adressen im Ram (die Pointer argumente wieder; bin nicht fähig zu formulieren :) )

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  
BeitragVerfasst: Mo Mär 26, 2012 18:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Lord Horazont hat geschrieben:
bin nicht fähig zu formulieren :)

mach dir nix draus, ich versteh dich schon^^ Leider hilft mirt die Festellung das ich glIndexPointer nicht brauch bei dem Problem auch nicht wirklich :(

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 27, 2012 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Der OpenGL-Fehler liegt nicht zufällig noch weiter davor? Du solltest so weit zurückgehen bis du keinen Fehler mehr bekommst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 29, 2012 13:54 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

der Fehler war definitiv vom glIndexPointer(GL_UNSIGNED_INT, 0, nil); Jetzt hab ich im ganzen Renderdurchlauf keinen Fehler mehr drin...

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Apr 11, 2012 02:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich hab den Fehler erstmal nicht weiter beachtet und mein Projekt weiter entwickelt. Und jetzt spinnt es schon wieder rum -.- Folgender Code arbeitet mit delphi 7, aber nicht mir FPC:
Code:
  1.  
  2. type
  3.   TVertex = packed record
  4.     X, Y, S, T: Single;
  5.   end;
  6. var
  7.   vertecs: array[0..4, 0..1] of TVertex;
  8.  
  9.   glDisable(GL_CULL_FACE);
  10.   glEnableClientState(GL_VERTEX_ARRAY);
  11.   glVertexPointer(2, GL_FLOAT, 16, @(vertecs[0, 0].X));
  12.   //glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  13.   //glTexCoordPointer(2, GL_FLOAT, 16, @vertecs[0, 0].X);
  14.   glDrawArrays(GL_QUAD_STRIP, 0, 10);
  15.   glDisableClientState(GL_VERTEX_ARRAY);
  16.   glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  17.   glEnable(GL_CULL_FACE);

Langsam bin ich echt ratlos :cry:

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.018s | 15 Queries | GZIP : On ]