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

Aktuelle Zeit: Di Jul 15, 2025 23:34

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Dez 02, 2011 13:46 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Hi.

Vielleicht hat der eine oder andere schon einen Blick in diesen Thread geworfen:
http://www.delphigl.com/forum/viewtopic.php?f=20&t=10182

Da nun klar ist, dass die Shader i.O. sind aber mein FBO scheinbar nicht, formuliere ich mein Problem wieder neu:

Ich möchte ein bekanntes Szenario implementieren, Render-To-Texture. Genauer soll in folgendem Testprogramm innerhalb eines FBO in eine weiße Textur ein rotes Dreieck gerendert werden. Dann wird der FBO geschlossen und ein normales Quad soll diese Textur erhalten.
Dazu soll folgender Code dienen:
Code:
  1.  
  2.   glMatrixMode(GL_PROJECTION);
  3.     glLoadIdentity;
  4.     glViewPort(0, 0, Form3.ClientWidth,Form3.ClientHeight);
  5.     gluPerspective(50, Form3.ClientWidth/Form3.ClientHeight, 1, 10000);
  6.     //Sichern für nachher
  7.     glPushMatrix;
  8.     //Jetzt für Render-To-Texture anpassen
  9.     glLoadIdentity();
  10.     gluPerspective(60.0, Size/Size , 1.0, 100.0);
  11.   glMatrixMode(GL_MODELVIEW);
  12.     glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  13.     glLoadIdentity;
  14.  
  15.     glPushAttrib(GL_VIEWPORT_BIT);
  16.     glViewport(0,0,Size,Size);
  17.  
  18.   glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  19.  
  20.   glClearColor(1, 1, 1, 1);
  21.   glColor3f(1,0,0);
  22.   glBegin(GL_TRIANGLES);
  23.     glVertex2f(0,0);
  24.     glVertex2f(0.5,1);
  25.     glVertex2f(1,0);
  26.   glEnd();
  27.  
  28.   glBindFramebuffer(GL_FRAMEBUFFER, 0);
  29.   glColor3f(1,1,1);
  30.  
  31.  
  32.   glMatrixMode(GL_PROJECTION);
  33.     glPopMatrix;
  34.   glMatrixMode(GL_MODELVIEW);
  35.     glPopAttrib;
  36.  
  37.   glClearColor(0, 0, 0, 0);
  38.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  39.  
  40.   glBindTexture(GL_TEXTURE_2D, tex);
  41.     glBegin(GL_QUADS);
  42.       glTexCoord2f(0,0); glVertex3f(-0.5,-0.5,-1);
  43.       glTexCoord2f(0,1); glVertex3f(-0.5,0.5,-1);
  44.       glTexCoord2f(1,1); glVertex3f(0.5,0.5,-1);
  45.       glTexCoord2f(1,0); glVertex3f(0.5,-0.5,-1);
  46.     glEnd();
  47.  


Initialisierung:
Code:
  1.  
  2. glEnable(GL_TEXTURE_2D);
  3.  
  4. glGenTextures(1,@tex);
  5. glGenFramebuffers(1, @fbo);
  6. glActiveTexture(GL_TEXTURE0);
  7. glBindTexture(GL_TEXTURE_2D, tex);
  8. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  9. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  10. glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F, Size, Size, 0, GL_RGBA, GL_FLOAT, a); //a ist weiß
  11.  
  12. glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  13. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D , tex, 0);
  14. glBindFrameBuffer(GL_FRAMEBUFFER, 0);
  15.  


Das Ergebnis ist ein weißes Quad...Ohne Textur und ohne alles. Wo liegt der Fehler?

Danke,
Flips


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 14:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hast du diesen Code aus dem Tutorial: Framebufferobject mal verwendet um FBO-Fehler abzufragen?
Eventuell mag dein Grafikkartentreiber nämlich nicht in GL_RGBA32F rendern… ich hatte sowas auch mal, musste dann was anderes nehmen.

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: Fr Dez 02, 2011 14:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
dein FBO hat kein Viewport usw ;)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 17:07 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Ja der Code zur Fehlerabfrage des FBO steht unter dem Initialisierungs-Teil. Der liefert explizit 'GL_FRAMEBUFFER_COMPLETE'.
Habe auch mal testweise das Format auf GL_RGBA (internalformat) und GL_UNSIGNED_BYTE (_type) geändert und dann glubyte's reingetan. Selbes Ergebnis (natürlich aus ner 1.0 eine $FF gemacht).


Zum Viewport, naja ich sage doch explizit:
Code:
  1.  
  2.   glMatrixMode(GL_MODELVIEW);
  3.     glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  4.     glLoadIdentity;
  5.     glPushAttrib(GL_VIEWPORT_BIT);
  6.     glViewport(0,0,Size,Size);  //<------
  7.  
  8.   glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  9.  [...]
  10.  

Oder was meinst du genau?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 17:16 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
ich meine genau das hier
selbiges gilt natürlich auch für alle Matrizen usw am besten ist es immer alle Werte zu speichern, den FBO als eigenes Fenster zu behandeln und danach
die Werte wieder herstellen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 17:31 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Naja aber das tu ich doch auch:
Ich stell meine Projektions-Matrix so ein wie ich sie normal brauche, dann speichere ich sie und stelle sie um für das FBO. Das selbe mache ich mit dem Viewport. Dann rendere ich in den FBO und stelle danach die alte Projektions-Matrix und den Viewport wieder her.

Selbst wenn ich den Code 1:1 übernehme und das
Code:
  1.  
  2.    glPushAttrib(GL_VIEWPORT_BIT);
  3.    glViewport(0,0,Size,Size);
  4.  


zwischen die glBindFramebuffer schreibe ändert das nichts.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 17:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
ist dein dreieck ohne FBOs überhaupt sichtbar?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 17:46 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Ich bin gerade dabei es zu prüfen. Also die kurze Antwort ist Nein.

Dafür aber ne kurze Verständnisfrage: Wenn mein FBO mein neues Fenster ist, dann rendere ich doch genau dann korrekt ins FBO, wenn mein Dreieck, das ich mir rendern will, mein Fenster komplett ausfüllt.

D.h. ich schalte das FBO jetzt erstmal aus und korrigiere so lange meine Perspektive, bis mein Fenster exakt von meinem gewünschten Bild ausgefüllt wird. Wenn ich dann das FBO anschalte dann landet es genau so in der Textur.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 18:07 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Es funktioniert mit folgendem Code:

Code:
  1.  
  2. glMatrixMode(GL_PROJECTION);
  3.     glLoadIdentity();
  4.     glOrtho(0,1,0,1,0, 100);
  5.     glViewPort(0,0,Size,Size);
  6.  
  7.   glMatrixMode(GL_MODELVIEW);
  8.     glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  9.     glLoadIdentity;
  10.  
  11.  
  12.   glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  13.  
  14.   glClearColor(1, 1, 1, 1);
  15.   glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);
  16.   glColor3f(1,0,0);
  17.   glTranslatef(0.5,0.5,0);
  18.   glBegin(GL_TRIANGLES);
  19.     glVertex2f(-0.5,-0.5);
  20.     glVertex2f(0,0.5);
  21.     glVertex2f(0.5,-0.5);
  22.   glEnd();
  23.  
  24.   glBindFramebuffer(GL_FRAMEBUFFER, 0);
  25.  
  26.   glClearColor(0,0,0,0);
  27.   glColor3f(1,1,1);
  28.  
  29.   glMatrixMode(GL_PROJECTION);
  30.     glLoadIdentity;
  31.     glViewPort(0, 0, Form3.ClientWidth,Form3.ClientHeight);
  32.     gluPerspective(50, Form3.ClientWidth/Form3.ClientHeight, 1, 10000);
  33.  glMatrixMode(GL_MODELVIEW);
  34.   glLoadIdentity;
  35.   glBindTexture(GL_TEXTURE_2D, tex);
  36.     glBegin(GL_QUADS);
  37.       glTexCoord2f(0,0); glVertex3f(-0.5,-0.5,-1);
  38.       glTexCoord2f(0,1); glVertex3f(-0.5,0.5,-1);
  39.       glTexCoord2f(1,1); glVertex3f(0.5,0.5,-1);
  40.       glTexCoord2f(1,0); glVertex3f(0.5,-0.5,-1);
  41.     glEnd();
  42.  


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 02, 2011 19:26 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Das Problem war das du bei deiner ersten Version mit perspektivischer Projektion das Dreieck zu nah an der Kamera gezeichnet hast. Wenn du nur Vertex2f verwendest wird die 3te Komponente zu 0, wodurch das Dreieck sich direkt auf der Kamera befindet. Alles was sich näher als die NearClippingPlane befindet (war in deinem Fall bei 1), wird aber nicht gezeichnet.

PS: Das glTranslate aus deiner 2ten Version müsste man sich eigentlich sparen können, wenn man die Vertexkoordinaten direkt ändert.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 03, 2011 15:48 
Offline
DGL Member

Registriert: Mi Aug 09, 2006 15:47
Beiträge: 44
Wohnort: St. Wendel
Programmiersprache: Delphi, C#, Java, C
Hi,

ja das mit dem glTranslate war nur, weil ich es noch zur Visualisierung rotieren lassen wollte und einen vernünftigen Drehpunkt wollte.
Bin übrigends im oben verlinkten Shader-Thread drauf aufmerksam gemacht worden, dass ich mir das glOrtho schenken kann wenn ich die ModelView -und Projection-Matrix als Einheitsmatrix hab.
Von daher ist jetzt alles top!


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.010s | 16 Queries | GZIP : On ]