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

Aktuelle Zeit: Fr Jul 18, 2025 12:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit Zeichnen im Hilfsbuffer
BeitragVerfasst: Mo Nov 03, 2008 12:41 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Hallo, ich habe folgendes Problem:

Ich rendere einen Teil der 3D-Szene in den Back-buffer. Anschließend setze ich durch den Aufruf von
glDrawBuffer(GL_AUX0) den Color-Buffer auf den AUX0-Buffer und zeichne einen weiteren Teil der Szene in
diesen Buffer rein (das ganze ist so gedacht um einige Überlappungsartefakte beim Blending umzugehen). Wenn
dieser Teil der Szene fertig ist, blende ich den Inhalt des AUX0-Buffers über dem Inhalt des Back-Buffers.
Dazu verwende ich folgenden Code:

Code:
  1.  
  2.           // set buffers
  3.           glReadBuffer(GL_AUX0);
  4.           glDrawBuffer(GL_BACK);
  5.  
  6.           // enable blending
  7.           glEnable(GL_BLEND);
  8.           glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  9.  
  10.           // copy pixels
  11.           glCopyPixels(0, 0, 800, 480, GL_COLOR);
  12.  
  13.           // disable blending
  14.           glDisable(GL_BLEND);
  15.  


Bis hier funktioniert der Code wie gewünscht: der zweite Teil der Szene wird über dem ersten geblendet.
Nun will ich über der bisher gezeichneten Szene weitere 3D-Objekte zeichnen. Und da gibt es Probleme:
diese Objekte werden einfach nicht gezeichnet. Als letztes zeichne ich noch einige 2D-Objekte auf dem Screen - das
funktioniert wunderbar.

Hat jemand eine Ahnung wieso diese 3D-Objekte nicht gezeichnet werden? Kann man einen Buffer nach glCopyPixels nicht mehr wie gewohnt benutzen? Aber wieso funktioniert es dann mit den 2D-Objekten, die am Ende gezeichnet werden?
Ach ja ohne die Verwendung des Extra-Buffers werden alle Objekte problemlos gezeichnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Möglicher weise wurde der Zbuffer zerstöhrt. Eine alternative wäre es in ein FBO zu rendern. Dazu müssten zwei FBOs verwendet werden das erste besteht aus einem Z buffer und einer textur und das zweite aus dem gleichem Z buffer und einer zweiten textur. Erst die undurchsichtigen Sceneteile in das erste FBO rendern und anschließen die transparenten teile in das zweite FBO. Kombinieren kann man beides mit blending oder mit einem shader.

_________________
Lumina plattform unabhängige GLSL IDE


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 15:15 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Dass der Z-Buffer kaputt ist, wäre eine Möglichkeit. Ich kann leider keine FBOs verwenden, weil die Hardware die ich benutze/benutzen muss, schon relativ alt ist und nicht mal OpenGL 1.5 unterstützt. Gibt es eine Möglichkeit den Z-Buffer vor dem Switchen auf den AUX0 zu speichern und nach dem Switchen auf den BACK wieder reinzuladen? Ich hab es mal schnell mit glReadPixels und glDrawPixels für GL_DEPTH_COMPONENT ausprobiert, aber das glDrawPixels schreibt dann anscheinend in den Color Buffer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 16:24 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bei dem von dir beschriebenen Verhalten würde ich ja fast sagen, dass glCopyPixels beim Schreiben in den Framebuffer die Tiefe der kopierten Pixel auf zNear setzt. Also auf den kleinsten Wert. Denn das könnte erklären warum deine 2D Objekte (typischerweise sehr kleiner Z Wert) gezeichnet werden aber deine 3D Obkjekte (typischerweise irgendwo im Raum) nicht gezeichnet werden.

Setz mal bitte glDepthMask(False) bevor du die Pixel kopierst. Damit verhinderst du, dass Werte in den Z-Buffer geschrieben werden. Anschließend solltest du diesen wieder aktivieren. Damit würden eventuelle Tiefenwerte im AUX0 aber ignoriert werden.

Evtl musst du glCopyPixels auch 2 Mal aufrufen. Beim zweiten Mal aber anstelle von GL_COLOR dann GL_DEPTH. Laut unserem Wiki ist das als Typ auch erlaubt. Damit solltest du dann dann die Tiefenwerte kopieren können. Allerdings bin ich mir nicht sicher ob die Grafikkarte da wirklich von begeistert sein wird, wenn du selber Tiefenwerte schreiben willst. Wenn sie es nicht ignorieren könnte es sein, dass du im Softwaremodus landest. Denn das ist ja vermutlich schon ein bisschen außergewöhnlich.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 16:36 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Das Verhindern des Beschreibens des Z-Buffers mit glDepthMask(false) hat geholfen! Hätte eigentlich auch selbst drauf kommen können..... :)

Vielen Dank!

Mike


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 03, 2008 22:59 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ist das Problem damit gelöst?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 04, 2008 01:10 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Ja ist gelöst. Danke nochmal! Soll ich den Thread irgendwie als "solved" markieren?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 04, 2008 08:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Soll ich den Thread irgendwie als "solved" markieren?

Also ich denke das ist schon vollkommen okay so. Ein Thema als erledigt markieren würde bei uns nur über den Titel des Themas gehen. Aber so was muss ja nicht sein. ;)


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


Wer ist online?

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