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

Aktuelle Zeit: Do Mär 28, 2024 19:25

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: IBO mit LazOpenGLCore erledigt
BeitragVerfasst: Do Jan 12, 2017 09:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Hallo,

ich versuche gerade mit LazOpenGLCore oGL 3.3 "näher kennenzulernen".
VBO, VAO kein Problem aber der IBO will nicht.

Den IBO binden ich ein wie ein VBO und fülle ihn
Code:
  1.  
  2.   ibo := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
  3.   ibo.BufferData(6, sizeof(gluint), TglcBufferUsage.buStaticDraw, nil);
  4.   pi := vbo.MapBuffer(TglcBufferAccess.baWriteOnly);
  5.   try
  6.     for k:=0 to 5 do
  7.     begin
  8.       pi^ :=indi[k];
  9.       inc(pi);
  10.     end;
  11.   finally
  12.     ibo.UnmapBuffer;
  13.   end;
  14.  



Dann den VAO anlegen und mit dem IBO bekanntmachen

Code:
  1.  
  2.   fVAO := TglcVertexArrayObject.Create;
  3.   fVAO.BindArrayBuffer(vbo, true);
  4.   fVAO.VertexAttribPointer(LAYOUT_LOCATION_POS,  3, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.pos));
  5.   fVAO.VertexAttribPointer(LAYOUT_LOCATION_TEX,  2, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.tex));
  6.   fVAO.VertexAttribPointer(LAYOUT_LOCATION_NORM, 3, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.nor));
  7.  
  8.   fVAO.BindArrayBuffer(ibo, true);
  9.  



Und ab hier sehe ich nur schwarz anstelle von 2 Dreiecken (= ein Quadrat)
Code:
  1.  
  2.   fVAO.BindArrayBuffer(ibo, true);
  3.   glDrawElements(GL_Triangles,  6, GL_Unsigned_Int,@ibo);
  4.  


Zeichne ich es so
Code:
  1.  
  2. glDrawArrays(GL_Quads,  0, 4);
  3.  

ist alles schön.

Wo habe ich mich denn dieses Mal wieder prasselig angestellt?


Zuletzt geändert von Twist am Mi Jan 18, 2017 07:23, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: Do Jan 12, 2017 09:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
In jedem Fall ist @ibo bei glDrawElements nicht richtig. Der letzte Parameter für glDrawElements ist ein Byte-Offset innerhalb des gebundenen IBOs, wenn ein IBO gebunden ist (sonst ist es tatsächlich ein Pointer). In deinem Fall ist ein IBO gebunden, daher solltest du da nil übergeben. Das ist im OpenGL Wiki, Artikel Vertex Rendering auch erklärt.

Das sollte dann an sich auch funktionieren. glDrawArrays ist aber der einfachere Befehl hier.

viele Grüße,
Horazont

_________________
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: IBO mit LazOpenGLCore
BeitragVerfasst: Do Jan 12, 2017 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
ich versuche gerade mit LazOpenGLCore oGL 3.3 "näher kennenzulernen".
VBO, VAO kein Problem aber der IBO will nicht.


Ist es dies was du suchst, siehe Anhang.

Das Dreieck und das Quadrat sind in meinem Beispiel schwarz, da ich für dieses einfache Beispiel keinen Shader verwendet habe.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: Fr Jan 13, 2017 08:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Zitat:
In deinem Fall ist ein IBO gebunden, daher solltest du da nil übergeben.

Mit dem nil bekomme ich dann ein SIGSEGV.

@ mathias
mit dem weglassen des IBO-bindens sehe ich auch nur schwarz.
Da muss also noch etwas anderes sein - ich versuche nicht nur ein Quadrat zu zeichnen sondern etwas komplexeres aus Quadraten. Da stimmt vielleicht etwas mit den Indizen nicht. Mal sehen.

Trotzdem Danke für die Antworten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: Fr Jan 13, 2017 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich bin neugierig geworden, und musste es mal probieren, dann ist folgender Anhang rausgekommen.

Dazu habe ich folgendes wie im Link beschrieben probiert,
http://www.spieleprogrammierung.net/201 ... uffer.html

Diese beiden Zeilen werden der springende Punkt sein:
Code:
  1.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBTriangle.IBO);
  2.   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(TriangleIndices), @TriangleIndices, GL_STATIC_DRAW);


Beim rendern dann folgendes:
Code:
  1.   glDrawElements(GL_TRIANGLES, Length(TriangleIndices), GL_UNSIGNED_INT, Nil);


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: So Jan 15, 2017 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Sicher dass du das IBO korrekt befüllt hast? Der Code fehlt in deinem Beispiel (aus dem ersten Post). Du mappst das vbo, aber unmapst das ibo. Das erscheint mir falsch. Was ist der Typ von pi?

viele Grüße,
Horazont

_________________
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: IBO mit LazOpenGLCore
BeitragVerfasst: Mo Jan 16, 2017 08:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Habe noch einen copy-paste Fehler gefunden aber es ändert nichts.
Hier etwas mehr Code:

Code:
  1.  
  2.  
  3.   pf: TglcContextPixelFormatSettings;
  4.   p: PVertex;
  5.   pi: PGluint;
  6.   vbo: TglcArrayBuffer;
  7.   fVAO: TglcVertexArrayObject;
  8.   ibo: TglcArrayBuffer;
  9.   k:integer;
  10.  
  11.              
  12.  
  13.   VertexL:= Length(fVERT) div 8  ;
  14.   vbo := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
  15.   vbo.BufferData(VertexL, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil);
  16.   p := vbo.MapBuffer(TglcBufferAccess.baWriteOnly);
  17.   try
  18.     for k:=0 to VertexL do
  19.     begin
  20.       p^.pos := gluVector3f(fVERT[k*8+0], fVERT[k*8+1], fVERT[k*8+2]);
  21.       p^.tex := gluVector2f(fVERT[k*8+3], fVERT[k*8+4]);
  22.       p^.nor := gluVector3f(fVERT[k*8+5], fVERT[k*8+6], fVERT[k*8+7]);
  23.       inc(p);
  24.     end;
  25.   finally
  26.     vbo.UnmapBuffer;
  27.   end;
  28.   // IBO einbinden Test
  29.   ibo := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
  30.   ibo.BufferData(6, sizeof(gluint), TglcBufferUsage.buStaticDraw, nil);
  31.   pi := ibo.MapBuffer(TglcBufferAccess.baWriteOnly);
  32.   try
  33.     for k:=0 to 5 do
  34.     begin
  35.       pi^ :=findi[k];
  36.       inc(pi);
  37.     end;
  38.   finally
  39.     ibo.UnmapBuffer;
  40.   end;
  41.  
  42.  
  43.   fVAO := TglcVertexArrayObject.Create;
  44.   fVAO.BindArrayBuffer(vbo, true);
  45.   fVAO.VertexAttribPointer(LAYOUT_LOCATION_POS,  3, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.pos));
  46.   fVAO.VertexAttribPointer(LAYOUT_LOCATION_TEX,  2, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.tex));
  47.   fVAO.VertexAttribPointer(LAYOUT_LOCATION_NORM, 3, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.nor));
  48.   // IBO Test
  49.   fVAO.BindArrayBuffer(ibo, true);  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: Mo Jan 16, 2017 15:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du rufst zweimal BindArrayBuffer von fVAO auf, einmal mit vbo und einmal mit ibo. Das klingt falsch, sollte eins davon nicht anders sein?

viele Grüße,
Horazont

_________________
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: IBO mit LazOpenGLCore
BeitragVerfasst: Mo Jan 16, 2017 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Was ich komisch finde, du behandelst den IBO und VBO mit den gleichen Methode. Auch das Create sieht gleich aus.

Wen du aber meinen Code anschaust, werden die beiden Puffer anders geladen.
Beachte GL_ARRAY_BUFFER und GL_ELEMENT_ARRAY_BUFFER.
Ich kenne LazOpenGLCore nicht, aber ich denke kaum, das dort eine Auto-detect Funktion vorhanden ist.

Code:
  1.   glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);
  2.   glBufferData(GL_ARRAY_BUFFER, sizeof(QuadVertex), @QuadVertex, GL_STATIC_DRAW);
  3.  
  4.   glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBQuad.IBO);
  5.   glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(QuadIndices), @QuadIndices, GL_STATIC_DRAW);  


PS: Wo kann man LazOpenGLCore runterladen, bei Google kommen nur tote Links.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: Di Jan 17, 2017 07:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Zitat:
PS: Wo kann man LazOpenGLCore runterladen, bei Google kommen nur tote Links.


https://git.delphigl.com/?p=LazOpenGLCo ... EAD;sf=tgz

Ansonsten bin ich zeitlich etwas eingeschränkt und kann nicht immer alles gleich nachschauen/ausprobieren.

Trotzdem Danke für Eure Mühen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore
BeitragVerfasst: Di Jan 17, 2017 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe einen Fehler bei dir entdeckt.

Code:
  1. ibo := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);

Diese Zeile müsste
Code:
  1. ibo := TglcArrayBuffer.Create(TglcBufferTarget.btElementArrayBuffer);

heissen.

Wen man die Unit uglcArrayBuffer.pas anguckt, hat es ganz am Anfang ein Beispiel, wie man einen IBO macht.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore erledigt
BeitragVerfasst: Mi Jan 18, 2017 07:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Ja Danke, habe es in der Nachtschicht auch gefunden und es geht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore erledigt
BeitragVerfasst: Mi Jan 18, 2017 08:30 
Offline
DGL Member
Benutzeravatar

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

nur noch ne kurze Info zum LazOpenGlCore. Das ist einfach nur ein Klassen-Wrapper für die OpenGL Methoden. Die Parameter sind eig genau die selben. Mit Ausnahme von von irgendwelchen Objektnamen (Objekt-IDs) die übergibt die Wrapper Klasse automatisch für das aktuelle Objekt.

€: Ich hab nur alles in Klassen oder Enums gewrappt, weil man dann im Editor genau sieht welche Werte für welche Parameter möglich sind. Das macht es am Anfang bisl einfacher.

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  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore erledigt
BeitragVerfasst: Mi Jan 18, 2017 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich finde es besser, wen man am Anfang OpenGL nativ verwendet, so sieht man eher was passiert und versteht es auch besser.
Aber dies ist wohl Geschmacksache.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: IBO mit LazOpenGLCore erledigt
BeitragVerfasst: Mi Jan 18, 2017 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Wie gesagt, die calls die du machen musst sind die selben. Da nimmt dir der Klassen-Wrapper nix ab. Du wirst IMHO nur besser durch die IDE unterstützt und es wird sichergestellt das alles sauber abgeräumt wird.
Aber stimmt schon, is alles Geschmackssache :)

_________________
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  [ 15 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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.102s | 17 Queries | GZIP : On ]