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

Aktuelle Zeit: Mo Jun 17, 2024 11:19

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



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: FBO funktioniert nicht korrekt
BeitragVerfasst: Mi Okt 09, 2013 15:27 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich habe einen Framebuffer erstellt, mit zugehörigen RenderBuffer, und möchte dort nun hinein rendern.
Mein Code sieht wie folgt aus (habe mich dabei so weit es geht sorgsam an euer Tutorial dazu gehalten):
Code:
  1.  
  2. glGenFramebuffers(1, &fboId);
  3. glBindFramebuffer(GL_FRAMEBUFFER, fboId);
  4. glGenRenderbuffers(1, &depthBuffer);
  5. glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer);
  6. glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, img.width, img.height);
  7. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
  8.     GL_RENDERBUFFER, depthBuffer);
  9. img.bind();
  10. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
  11.     GL_TEXTURE_2D, img.Id, 0);
  12. glPushAttrib(GL_VIEWPORT_BIT);
  13. glViewport(0, 0, img.width, img.height);
  14.  
  15. /// ... Render Vorgang
  16.  
  17. glPopAttrib();
  18. glBindFramebuffer(GL_FRAMEBUFFER, 0);
  19.  

Ich sehe aber nichts auf der Textur, also keine Auswirkungen. Ich habe dann die wichtigsten Aufrufe abgefangen und mit dieser Methode (auch aus eurem Tutorial) validiert:
Code:
  1.  
  2. void checkError(size_t line = __LINE__) {
  3.     GLenum error = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  4.  
  5.     switch (error) {
  6.         default:
  7.         case GL_FRAMEBUFFER_COMPLETE:
  8.             writeln("Complete ", line);
  9.         break;
  10.         case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
  11.             writeln("Incomplete attachment ", line);
  12.         break;
  13.         case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
  14.             writeln("Missing attachment ", line);
  15.         break;
  16.         //case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
  17.         //    writeln("Incomplete dimensions ", line);
  18.         //break;
  19.         //case GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
  20.         //    writeln("Incomplete formats ", line);
  21.         //break;
  22.         case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
  23.             writeln("Incomplete draw buffer ", line);
  24.         break;
  25.         case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
  26.             writeln("Incomplete read buffer ", line);
  27.         break;
  28.         case GL_FRAMEBUFFER_UNSUPPORTED:
  29.             writeln("Framebufferobjects unsupported ", line);
  30.         break;
  31.     }
  32. }
  33.  


Dabei kommen folgende Meldungen für die jeweiligen Aufrufe heraus:
Zitat:
glGenFramebuffers(1, &fboId); Complete 268
glBindFramebuffer(GL_FRAMEBUFFER, fboId); Missing attachment 270
glGenRenderbuffers(1, &depthBuffer); Missing attachment 272
glBindRenderbuffer(GL_RENDERBUFFER, depthBuffer); Missing attachment 274
glRenderbufferStorage(GL_RENDERBUFFER, Missing attachment 276
GL_DEPTH_COMPONENT, img.width, img.height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, Incomplete draw buffer 278
GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
img.bind();
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, Complete 281
GL_TEXTURE_2D, img.Id, 0);


Mache ich etwas falsch? Oder woran kann es liegen, das es nicht wie gewünscht funktioniert?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Mi Okt 09, 2013 17:10 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Nach ein wenig überlegen habe ich es hinbekommen. Aber ich habe noch zwei Fragen.
Dieser Code:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(FBO(140, 140, img.Id));
  3.     img.bind();
  4.     fbo.bind();
  5.  
  6.     glPushAttrib(GL_VIEWPORT_BIT | GL_CURRENT_BIT);
  7.     glPushMatrix();
  8.  
  9.     glMatrixMode(GL_MODELVIEW);
  10.     glLoadIdentity();
  11.  
  12.     glMatrixMode(GL_PROJECTION);
  13.     glLoadIdentity();
  14.  
  15.     glViewport(0, 0, 140, 140);
  16.     glOrtho(0, 140, 140, 0, 1, -1);
  17.    
  18.     glBegin(GL_QUADS);
  19.         glVertex2f(10, 10); glColor3f(1, 0, 0);
  20.         glVertex2f(25, 10); glColor3f(0, 1, 0);
  21.         glVertex2f(25, 25); glColor3f(0, 0, 1);
  22.         glVertex2f(10, 25); glColor3f(1, 0, 0);
  23.     glEnd();
  24.  


1. Funktioniert nur, wenn ich glViewport und glOrtho verwende. Wieso? Und ließe sich das vermeiden?
2. Wieso ist mein Quadrat nach wie vor schwarz, obwohl ich doch mit glColor3f eine Farbe angebe?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Mi Okt 09, 2013 19:35 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Und noch eine dritte Frage: Sobald ich den Framebuffer entbunden habe, kann ich zwar weiterhin andere Texturen setzen, aber die Änderungen beziehen sich nicht mehr auf die neueren Texturen.
Entbinde ich den FBO aber erst nachdem ich z.B. auf zwei gleichgroße Texturen etwas gerendert habe, dann gibt es keine Probleme.

Code:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(img);
  3. fbo.bind();
  4. fbo.draw(va_many);
  5.  
  6. fbo.setTexture(trans_img);
  7. fbo.draw(va_many);
  8. fbo.unbind();
  9.  


produziert diese Ausgabe:
Bild

Und dies:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(img);
  3. fbo.bind();
  4. fbo.draw(va_many);
  5. fbo.unbind();
  6.  
  7. fbo.setTexture(trans_img);
  8. fbo.bind();
  9. fbo.draw(va_many);
  10. fbo.unbind();
  11.  


diese Ausgabe:
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Mi Okt 09, 2013 21:26 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Es macht wirklich allen Anschein, dass nach dem entbinden keine Änderungen mehr angenommen werden. Aber verfehlt das nicht den kompletten Sinn eines FBO?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 10:35 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Keiner eine Idee woran das liegen könnte?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 10:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich weiß ja nicht, wie dein setTexture aussieht, aber das FBO muss gebunden sein, damit du änderungen daran vornehmen kannst.

Generell empfiehlt es sich, bei so merkwürdigem Verhalten und besonders, wenn man FBOs und so sowieso schon in klassen gepackt hat, folgendes zu implementieren.

Man baut sich in seiner Klasse eine Boolean Property oder ein Boolean Feld, z.B. genannt „Debug“. Dann baut man sich eine Methode RaiseLastOpenGLError. Diese sieht ungefähr so aus:
Code:
  1. procedure TFoo.RaiseLastOpenGLError;
  2. var errno: GLenum;
  3. begin
  4.   if not Debug then
  5.     Exit;
  6.   errno = glGetError();
  7.   if errno <> GL_NO_ERROR then
  8.   begin
  9.     raise Exception.Create("OpenGL error: "+IntToStr(errno));
  10.   end;
  11. end;


Die rufst du in deinem Code nach jedem OpenGL-Aufruf auf. Das kostet nicht allzu viel, wenn Debug false ist. Wenn Debug true ist, wird es dir sofort mitteilen, wenn du einen Fehler machst.

grüße

_________________
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: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 11:05 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Das hab ich schon.
Ich poste mal alles was ich so habe, hoffentlich erschlägt das niemanden.

Meine FBO Klasse (in D Code): http://codepad.org/GuaPV1Rs
Das dort vorkommende glCheck (hat sich bisher immer bewährt, meldet hierbei aber nichts): http://codepad.org/LDtJS2lM

Und meine zwei Versuche:

Versuch 1 sieht so aus: Bild
Und wird folgendermaßen geregelt:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(fbo_img1);
  3. fbo.bind();
  4. fbo.draw(va_many);
  5. fbo.setTexture(fbo_img2);
  6. fbo.draw(circle2);
  7. fbo.unbind();
  8.  


Wenn ich nun nach dem ersten draw ein unbind mache und danach wieder binde und nochmal versuche, etwas zu rendern, geschieht dies jedoch nicht.
Versuch #2 sieht daher folgendermaßen aus: Bild
Und der dazugehörige Code:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(fbo_img1);
  3. fbo.bind();
  4. fbo.draw(va_many);
  5. fbo.unbind();
  6. fbo.bind();
  7. fbo.setTexture(fbo_img2);
  8. fbo.draw(circle2);
  9. fbo.unbind();
  10.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 12:27 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Ich habe mal alle binds und unbinds aus der Klasse rausgeworfen und mal etwas rumgespielt (btw der neue Code der Klasse, nur leicht verändert: http://codepad.org/oQp0ZG1F).
Es liegt definitiv am unbind:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(fbo_img1);
  3. fbo.bind();
  4. fbo.draw(va_many);
  5. //fbo.unbind(); /// <--- Übeltäter
  6. fbo.bind();
  7. fbo.setTexture(fbo_img2);
  8. fbo.draw(circle2);
  9. fbo.unbind();
  10.  

Kommentiere ich dieses unbind aus, geht alles wie gehabt, in beiden Texturen landet nacheinander das gerenderte. Sobald ich einmal aber unbind aufgerufen habe, scheint es nicht möglich, den Framebuffer nochmal zu binden.
Wenn ich jetzt bestätigt bekäme, dass das normales Verhalten ist, wäre ich schon zufrieden. Ansonsten weiß ich halt echt nicht woran es liegen könnte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 14:17 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
nein das sollte eigentlich keine Probleme geben. Eigentlich sagst du ja im unbind nur das er den Hauptframebuffer benutzen soll.

Spontant wuerde ich erstmal nur 2 Sachen aendern:
1.) Das matrix push/pop gelten nur fuer die ausgewaehlte Matrix.... muesste also fuer Projection und Modelview hier aufrufen
2.) bau mal noch die Aufrufe zu drawbuffer ein, eventuell verursacht das die Probleme hier.


btw, kennst du zufaellig ne brauchbare IDE fuer D die auch unter Win8 funktioniert?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 14:24 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
yunharla hat geschrieben:
nein das sollte eigentlich keine Probleme geben. Eigentlich sagst du ja im unbind nur das er den Hauptframebuffer benutzen soll.

Spontant wuerde ich erstmal nur 2 Sachen aendern:
1.) Das matrix push/pop gelten nur fuer die ausgewaehlte Matrix.... muesste also fuer Projection und Modelview hier aufrufen
2.) bau mal noch die Aufrufe zu drawbuffer ein, eventuell verursacht das die Probleme hier.

Hab es gerade gelöst durch einen Denkanstoß aus einem anderen Forum. Das Problem war, dass ich EXT Methoden mit normalen gemischt habe. Damit kam OpenGL wohl nicht klar. Nun mit konsistenten Aufrufen geht alles wunderbar. Trotzdem danke. :)

yunharla hat geschrieben:
btw, kennst du zufaellig ne brauchbare IDE fuer D die auch unter Win8 funktioniert?

VisualD: http://forum.dlang.org/thread/l0mevt$v3 ... almars.com
und Mono: http://forum.dlang.org/thread/ngudyfslw ... .dlang.org
Code::Blocks tut es auch, hat aber nicht so schöne Auto Vervollständigung. Die beiden erst genannten nutze ich schon lange und bin mit beiden hoch zufrieden. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Do Okt 10, 2013 19:56 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
rswhite hat geschrieben:
Nach ein wenig überlegen habe ich es hinbekommen. Aber ich habe noch zwei Fragen.
Dieser Code:
Code:
  1.  
  2. FrameBufferObject fbo = new FrameBufferObject(FBO(140, 140, img.Id));
  3.     img.bind();
  4.     fbo.bind();
  5.  
  6.     glPushAttrib(GL_VIEWPORT_BIT | GL_CURRENT_BIT);
  7.     glPushMatrix();
  8.  
  9.     glMatrixMode(GL_MODELVIEW);
  10.     glLoadIdentity();
  11.  
  12.     glMatrixMode(GL_PROJECTION);
  13.     glLoadIdentity();
  14.  
  15.     glViewport(0, 0, 140, 140);
  16.     glOrtho(0, 140, 140, 0, 1, -1);
  17.    
  18.     glBegin(GL_QUADS);
  19.         glVertex2f(10, 10); glColor3f(1, 0, 0);
  20.         glVertex2f(25, 10); glColor3f(0, 1, 0);
  21.         glVertex2f(25, 25); glColor3f(0, 0, 1);
  22.         glVertex2f(10, 25); glColor3f(1, 0, 0);
  23.     glEnd();
  24.  


1. Funktioniert nur, wenn ich glViewport und glOrtho verwende. Wieso? Und ließe sich das vermeiden?
2. Wieso ist mein Quadrat nach wie vor schwarz, obwohl ich doch mit glColor3f eine Farbe angebe?

Diese Fragen bleiben allerdings offen. Weiß dazu jemand was?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Fr Okt 11, 2013 08:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
Eigentlich sollte es auch mit glPerspective funktionieren, check mal die std gründe in der wiki für wenn man nichts sieht.

2. evtl ist noch deine textur gebunden, und weiterhin gilt glColor für das nächste glVertex folglich hat dein erster Vertex noch die Farbe von vorher, dadurch dürfte zwar nicht das gesamte quad schwarz sein, aber das solltest du dennoch beachten. (glVertex immer als letztes in die zeile ;) )

probier mal glDisable(GL_TEXTURE_2D); vor dem zeichnen des quads, danach logischerweise wieder enablen.

Edit: Und rein aus sicherheitsgründen setzte nachdem ändern der projection wieder die modelviewmatrix, ansonsten geraten dir schnell mal deine Matrizen durcheinander.


Zuletzt geändert von Knittel am Fr Okt 11, 2013 08:49, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Fr Okt 11, 2013 08:49 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Du meinst gluPerspective? Glu kann ich leider nicht nutzen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Fr Okt 11, 2013 08:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
willst du überhaupt 3D, oder was ist bei deiner Frage 1 genau das Problem? (glViewport und glOrtho sind unerschiedliche Befehle, sie bewirken unerschiedliche Sachen, daher sind beide nötig)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FBO funktioniert nicht korrekt
BeitragVerfasst: Fr Okt 11, 2013 08:59 
Offline
DGL Member

Registriert: Di Dez 13, 2011 19:14
Beiträge: 166
Wohnort: Hamburg / Mölln
Programmiersprache: D
Im Tutorial war aber nur die Rede von glViewport, weswegen ich neugierig war.


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


Wer ist online?

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