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

Aktuelle Zeit: Fr Dez 03, 2021 07:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
Autor Nachricht
BeitragVerfasst: Mi Nov 24, 2021 14:52 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Hallo,
OpenGL stellt mich jedes mal wieder vor neue Probleme, bei denen ich nicht den geringsten Ansatz habe, wie und wo ich überhaupt nach einer Lösung suchen sollte.

In meiner Software kann der Benutzer beliebig viele Objekte gleichen Types darstellen lassen: ähnlich einer Website können hier mehrere Texte, Bilder etc. beliebig platziert werden.

Da meine Software -zu einem gewissen Grad- nun "responsive Design" anbietet, muss ich nach dem Ändern von Inhalten durch den Benutzer nun ggf. Texte schrumpfen oder anders ausrichten, damit alles auf dem Bildschirm Platz findet. Diese Berechnungen sind relativ aufwändig (da für jeden Platzierungs-Versuch die Texturen für die neue Schriftgröße generiert werden müssen etc.), deswegen lasse ich sie nach einer Änderung einmalig durchführen, und zeichne die Texte dann jeweils in einem Framebuffer FBO, um daraus eine Textur zu erstellen. In den nachfolgenden Renderdurchläufen wird dann nur noch die Textur gezeichnet und fertig.

Vorteil: Die Textur kann ich als .png exportieren und in der normalen VCL Anwendung darstellen lassen.


Problem:
Die Benutzerinhalte werden in einer Baumstruktur verarbeitet. Ich rufe nur HauptObjekt.Render auf, dieses Rendert dann sich selbst und all seine Child-Objekte. Manche (Child-)Objekt müssen aus technischen Gründen in einen FBO rendern was spätestens dann Probleme verursacht, wenn DIESE wiederum Child-Objekte enthalten, die auch auf einen anderen/neuen FBO zeichen.

Code:
  1. HauptObjekt Begin
  2.   Child1 Begin
  3.     Verwende FBO
  4.        Zeichne Text Begin
  5.         Zeichne Text Ende
  6.        Zeichne WetterWidget
  7.        Verwende FBO
  8.          Zeichne Text Begin
  9.           Zeichne Text Ende
  10.          Zeichne Text Begin
  11.           Zeichne Text Ende
  12.        FBO Ende
  13.        Zeichne Text Begin
  14.         Zeichne Text Ende
  15.      FBO Ende
  16.   Child1 Ende
  17. HauptObjekt Ende
  18.  


Nachdem das Zeichnen mit dem FBO der 2. Stack-Ebene beendet ist, und der entsprechende FBO ge-unbind-ed wurde, zeichnen die Objekte leider irgendwohin (wohl auch in den DC/RC des Hauptprogramms), aber nicht in den FBO der ersten Ebene...

Die einzelnen Sachen kann ich nicht ohne OpenGL auf eine Textur zeichnen, da mir hierfür die grafischen Mittel fehlen.

Gibt es ein Gegenstück zu
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
mit dem ich die ID des aktuellen FBO *auslesen* kann, dass -nachdem der FBO der 2. Ebene fertig ist, und ich dessen .Unbind aufrufe, er wieder den ursprünglichen FBO binden kann? Oder mit Push/PopAttrib oder sowas?


Generell würde ich gerne die Textur-Erzeugung quasi unabhängig vom restlichen Programm machen.
Da die Texturen aber während der Laufzeit doch imo "recht häufig" neu erzeugt werden müssen, kann ich das nicht in einem separaten OpenGL DC/RC machen, auch weil ich Diese nicht so einfach als Textur speichern kann (die Transparenz-Bits gehen verloren, da es dann nur ein "Screenshot" des OpenGL-Bereichs wäre).

Muss ich ansonsten bei Änderungen erst mal "Alles auf Stop" machen, EINZELN (ohne Stack, sondern alles auf "Ebene 0") die FBOs render und als Textur speichern lassen und dann wieder weiter mit dem Rendern und die nun erzeugten Texturen rendern lassen?

Ich habe das Problem, dass das Konfigurationsprogramm meiner Software von Kunden auch auf Terminalservern genutzt werden muss. Ignoriert mal bitte Framerate, Farbechtheit, fehlende Hardware etc. - zum Einstellen genügt das den Kunden vollauf. Das Problem: die virutellen Grafikkarten der Terminalserver unterstützten keine Framebuffer --> Exception beim Erstellen des FBO! Wie könnte ich hier die Texturen (mit Transparenz) erzeugen?

Danke!


Edit 1:
Beim Binden des Framebuffers die ID des aktuellen FBO abspeichern:
Code:
  1.  
  2.     try
  3.       AlterFBO := 0;
  4.       glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, @alterfbo);
  5.     except end;
  6.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  7.  


Beim Unbinden nach dem erstellen des FBO den alten FBO wieder aktivieren:
Code:
  1.  
  2.     if (AlterFBO <> 0) and (AlterFBO <> FBO) then begin
  3.       try
  4.         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, AlterFBO);
  5.       except
  6.         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  7.       end;
  8.     end else begin
  9.       glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  10.     end;
  11.     AlterFBO := 0;
  12.  

Beim Erzeugen bitte AlterFBO mit 0 initialisieren nicht vergessen!

Schein generell erstmal zu passen. Muss ich noch etwas berücksichtigen?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 1 Beitrag ] 
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.061s | 17 Queries | GZIP : On ]