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

Aktuelle Zeit: Do Mär 28, 2024 22:31

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



Ein neues Thema erstellen Auf das Thema antworten  [ 39 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Autor Nachricht
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Sa Okt 31, 2015 13:33 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
glAwesome hat geschrieben:
Code:
  1.  glGenFramebuffers(1, @FramebufferName);

Wenn es genau hier ein SIGSEV gibt und FramebufferName deklariert wurde, riecht das ganz stark danach, dass glGenFramebuffers nil ist.


Und was müsste ich genau dagegen tun? Fehlende Unit? Kompilieren ist kein Problem. Der OpenGL Bereich wird auch richtig angezeigt.

Hat vielleicht einer ein kleines Lazarus Beispielprogramm, wo genau die Verwendung von Framebuffer läuft?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Sa Okt 31, 2015 14:15 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
glAwesome hat geschrieben:
Und was müsste ich genau dagegen tun?

Na, erstmal mit dem Debugger nachschauen, ob dies tatsächlich der Fall ist. Wenn ja: Wurde der Funktionszeiger nicht initialisiert, weil dglInit (oder wie das beim DGL-Header heißt) nicht aufgerufen wurde? Oder liegt es daran, dass die Framebuffer-Extension nicht verfügbar ist? Das wurde hier ja auch schon von anderen vorgeschlagen, aber bisher hast du nicht geschrieben, ob du diese Dinge geprüft hast.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Mo Nov 02, 2015 10:55 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
glAwesome hat geschrieben:
glAwesome hat geschrieben:
Und was müsste ich genau dagegen tun?

Na, erstmal mit dem Debugger nachschauen, ob dies tatsächlich der Fall ist. Wenn ja: Wurde der Funktionszeiger nicht initialisiert, weil dglInit (oder wie das beim DGL-Header heißt) nicht aufgerufen wurde? Oder liegt es daran, dass die Framebuffer-Extension nicht verfügbar ist? Das wurde hier ja auch schon von anderen vorgeschlagen, aber bisher hast du nicht geschrieben, ob du diese Dinge geprüft hast.


so, bin wieder im Lande, jetzt kann ich auf die Fragen antworten, wozu ich meinen Rechner brauchte.

Die OpenGL version ist 4.5.0, aber der Funktionszeiger hat beim Debuggen den Wert 0, also wie glAwesome schon sagt nicht initialisiert. DglInit kann ich als Funktion nicht finden, aber InitOpenGL. Bekomme aber auch nach dem Ausführen von InitOpenGL die gleichen Fehlermeldungen und der Funktionszeiger von glgenFramebuffers liefert immer noch 0. :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Mo Nov 02, 2015 18:37 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe dein Code genauer angeguckt, dort hat es eine Methode OpenGLControl1MakeCurrent, die wird nirgends aufgerufen.
Komisch, das es ohne diese beiden Zeilen überhaupt läuft.
Code:
  1.   ReadExtensions; // Anstatt der Extentions kann auch nur der Core geladen werden. ReadOpenGLCore;
  2.   ReadImplementationProperties;    


Bei mir sieht eine einfache FormCreate so aus:
Code:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   InitOpenGL;
  4.  
  5.   OpenGLControl1.MakeCurrent;
  6.  
  7.   ReadExtensions;
  8.   ReadImplementationProperties;
  9.  
  10.   InitScene;
  11. end;


In deinem Code würde ich es hier probieren:
Code:
  1. Procedure TForm1.FormCreate(Sender: TObject);
  2. Begin
  3.   // Init dglOpenGL.pas , Teil 1
  4.   If Not InitOpenGl Then Begin
  5.     showmessage('Error, could not init dglOpenGL.pas');
  6.     Halt;
  7.   End;
  8.  
  9.   OpenGLControl1.MakeCurrent; // evtl. weglassen, da bei mir keine rote Linie mehr kommt.
  10.  
  11.   ReadExtensions;
  12.   ReadImplementationProperties;
  13. End;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Nov 03, 2015 17:03 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
das
Code:
  1. OpenGLControl1.MakeCurrent;

war erst einmal die Lösung, um die Funktion glgenFrambuffer zu initialisieren.

Jetzt ist bei mir der OpenGl Bildschirm nach der FBO-Bearbeitung schwarz. Ich habe schon versucht, mit
Code:
  1.  
  2. glGetIntegerv(GL_FRAMEBUFFER_BINDING, @oldFBO);
  3. glGetIntegerv(GL_RENDERBUFFER_BINDING, @oldDRB);
  4. .
  5. .
  6. FBO Bearbeitung
  7. .
  8. .
  9. glBindFramebuffer(GL_FRAMEBUFFER, OldFbo);
  10. glBindRenderbuffer(GL_RENDERBUFFER, OldDRB);
  11.  
  12. OpenGLControl1.MakeCurrent;
  13. ..Draw...
  14.  


das OpenGLControl wieder als aktiven Rendercontext festzulegen, aber
ich erhalte immer nur ein Schwarzes Rechteck


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Nov 03, 2015 18:35 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Es war mir ein bisschen langweilig, und habe meine Demo auf altes OpenGL umgesetzt.
Es wird ein Dreieck in eine Textur gerendert.
Anschliessend rendere ich die Textur in ein Quad.

Natürlich müssen noch die Matrixen angepasst werden.

Ich hoffe, das ich dir damit helfen konnte.

Code:
  1. unit unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  9.   ExtCtrls, OpenGLContext, dglOpenGL;
  10.  
  11. type
  12.  
  13.   { TForm1 }
  14.  
  15.   TForm1 = class(TForm)
  16.     OpenGLControl1: TOpenGLControl;
  17.     Timer1: TTimer;
  18.     procedure FormCreate(Sender: TObject);
  19.     procedure Timer1Timer(Sender: TObject);
  20.   private
  21.     textureID0, textureID1: GLuint;
  22.  
  23.     // Render Bufffer
  24.     FramebufferName, depthrenderbuffer: GLuint;
  25.     procedure initScene;
  26.     { private declarations }
  27.   public
  28.     { public declarations }
  29.   end;
  30.  
  31. var
  32.   Form1: TForm1;
  33.  
  34. implementation
  35.  
  36. { TForm1 }
  37.  
  38. const
  39.   TexturSize = 32;
  40.  
  41. procedure TForm1.Timer1Timer(Sender: TObject);
  42. begin
  43.   // In Buffer rendern
  44.  
  45.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  46.   glClearColor(1.0, 0.5, 0.5, 1.0);
  47.   glViewport(0, 0, TexturSize, TexturSize);
  48.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  49.   glEnable(GL_DEPTH_TEST);
  50.  
  51.   glDisable(GL_TEXTURE_2D);
  52.  
  53.   glRotatef(1.0, 0.0, 0.0, 1.0);
  54.  
  55.   glBegin(GL_TRIANGLES);
  56.   glColor3f(1, 0, 0);
  57.   glVertex3f(0, 1, 0);
  58.   glColor3f(0, 1, 0);
  59.   glVertex3f(-1, 0, 0);
  60.   glColor3f(0, 0, 1);
  61.   glVertex3f(1, 0, 0);
  62.   glEnd;
  63.  
  64.   // in Bildschirm rendern
  65.  
  66.   glBindFramebuffer(GL_FRAMEBUFFER, 0);
  67.   glClearColor(0.5, 1.0, 0.5, 1.0);
  68.   glViewport(0, 0, Width, Height);
  69.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  70.   glEnable(GL_DEPTH_TEST);
  71.  
  72.   glEnable(GL_TEXTURE_2D);
  73.   glBindTexture(GL_TEXTURE_2D, textureID0);
  74.  
  75.   glBegin(GL_QUADS);
  76.   glColor3f(1, 1, 1);
  77.  
  78.   glTexCoord2f(1, 0);
  79.   glVertex3f(-0.8, 0.8, 0);
  80.   glTexCoord2f(1, 1);
  81.   glVertex3f(-0.8, -0.8, 0);
  82.   glTexCoord2f(0, 1);
  83.   glVertex3f(0.8, -0.8, 0);
  84.   glTexCoord2f(0, 0);
  85.   glVertex3f(0.8, 0.8, 0);
  86.   glEnd;
  87.  
  88.   OpenGLControl1.SwapBuffers;
  89. end;
  90.  
  91. procedure TForm1.initScene;
  92. begin
  93.   // Leere Textur erzeugen
  94.  
  95.   glGenTextures(1, @textureID0);
  96.   glBindTexture(GL_TEXTURE_2D, textureID0);
  97.  
  98.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TexturSize, TexturSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
  99.  
  100.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  101.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  102.  
  103.   // Frame Buffer erzeugen
  104.  
  105.   glGenFramebuffers(1, @FramebufferName);
  106.   glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
  107.  
  108.   glGenRenderbuffers(1, @depthrenderbuffer);
  109.   glBindRenderbuffer(GL_RENDERBUFFER, depthrenderbuffer);
  110.  
  111.   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, TexturSize, TexturSize);
  112.   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthrenderbuffer);
  113.  
  114.   glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureID0, 0);
  115.  
  116.   Timer1.Enabled := True;
  117. end;
  118.  
  119. procedure TForm1.FormCreate(Sender: TObject);
  120. begin
  121.   Timer1.Enabled := False;
  122.   Timer1.Interval := 10;
  123.   InitOpenGL;
  124.   OpenGLControl1.MakeCurrent;
  125.   ReadExtensions;
  126.   ReadImplementationProperties;
  127.  
  128.   initScene;
  129. end;
  130.  
  131. initialization
  132.   {$I unit1.lrs}
  133.  
  134. end.


PS: Am Ende müsste man noch mit
Code:
  1.   glDeleteFramebuffers(1, @FramebufferName);
  2.   glDeleteRenderbuffers(1, @depthrenderbuffer);
  3.  
aufräumen.
Auch die Textur muss man noch löschen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Nov 03, 2015 21:13 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
@mathias

vielen Dank für Deine Mühen. Es läuft :)

Jetzt kommt die nächste Frage, wie bekomme ich den Framebuffer in eine Bitmap übertragen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Rendern in Bitmap
BeitragVerfasst: Di Nov 03, 2015 22:21 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
glReadPixels
Du musst nur vorher den Buffer gebunden haben.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: [gelöst] Re: Rendern in Bitmap
BeitragVerfasst: Mi Nov 04, 2015 15:16 
Offline
DGL Member

Registriert: Mo Feb 27, 2012 14:34
Beiträge: 25
Programmiersprache: Pascal
vielen Dank an euch vor allem an mathias, der sich für mich die Arbeit gemacht hat, bei mir funktioniert jetzt auch das Auslesen mit glreadpixels und somit gilt das Thema für mich als gelöst. Ich werde bestimmt noch ein paar mehr Fragen zu anderen Themen rund um OpenGL haben, aber die tauchen bekanntlich immer dann auf, wenn man meint es geschafft zu haben.


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


Wer ist online?

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