ich grüble zur Zeit über mein Framebuffer Management nach und hab hier ein paar fragen, bzw evtl hat einer ein paar Anregungen.
Wenn man z.B. 5 verschiedene teile im Code hat an denen man einen Framebuffer mit der größe 800x600 braucht (mit RGBA Textur + DepthBuffer), dann macht es ja vermutlich sehr viel sinn nur einen Framebuffer zu erzeugen und diesen eben 5x zu benutzen.
Aber, wie macht man das gescheit? Ich bin kein Fan davon das ich mich selber drum kümmern muß wo ich welchen Framebuffer nutzen will, sondern hätte gern etwas á la "Framebuffer Manager gibt mir einen Framebuffer mit der Auflösung 800x600, einer RGBA Textur und einem DepthBuffer".
Das umzusetzen ist allerdings nicht ganz so einfach, da es ja sehr viele verschiedene kombinationen an Framebuffern gibt. Es kann welche mit mehr als einer RGBA Textur geben, oder einen wo der Depth Buffer eine Textur statt eines Buffers ist, oder FloatRGBA oder mit bis zu vier Renderbuffern etc...
Jetzt überlege ich ob es wirklich sinn macht einen so komplizierten Manager zu schreiben, oder ob es noch andere Möglichkeiten gibt.
Macht es z.B. einen unterschied ob ich an einen Framebuffer einen Depthbuffer als Renderbuffer (mit dazu erzeugtem glRenderbufferStorage) attache der als Textur? Ist eines von beiden effizienter? Wenn nicht könnte man ja schonmal einfach IMMER eine Textur benutzen und würde den Manager so schon vereinfachen.
Oder hat jemand noch nette andere Ideen diesbezüglich?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Spontan könnte ich mir vorstellen, eine Art sprintf für Framebuffer zu bauen. Also z.B. "800,600;tex:rgba8;tex:depth16". Der Manager könnte dann aus einer Hashmap bestehen, die diese Identifier auf echte FBOs mappt. Und wenn er nicht existiert, wird er erzeugt.
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 network • my 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
Registriert: Sa Nov 24, 2007 11:59 Beiträge: 116
Programmiersprache: FreePascal
Naja, würde dann sogar MRTs untertützen, aber das geht spätestens dann schief, wenn du zwei gleichartige Framebuffer brauchst, die beide später noch verwendet werden.
Ich würde von so einem Manager zwar eher abraten und die Dinger manuell erzeugen und verwalten, immerhin weißt du selbst am besten, wann deine Renderpipeline irgendeinen Buffer nicht mehr braucht, aber wenn du sowas schon haben willst, solltest du einiges beachten: - Warum einen Buffer mit 800x600 RGBA und einen mit 800x600 RGB erzeugen? Dann lieber einmal überflüssigerweise in einen Alphakanal nur Einsen rendern. - Die Dinger müssen blockiert und freigegegben werden können, d.h. wenn du in Renderpass 1 was in Buffer A reinrenderst und in Renderpass 2 was in Buffer B, wofür du A lesen musst, darf A nicht überschrieben werden - Vielleicht ist es sinnvoller, auch einmal in einen 48Bit-Buffer zu rendern, wenn er schon da ist, auch wenn nur 24Bit gebraucht werden. Spart unter Umständen einen Buffer. - Selbiges gilt für den Depth Buffer, wenn man den nicht braucht, er aber da ist, macht man halt glDepthMask(False); und ggf den Tiefentest aus, fertig. Braucht man kein neues FBO für, Grafikspeicher ist bekanntlich rar.
Ich denke mal, damit könnte man relativ effizient Speicher sparen.
Ach ja, ist es eigentlich möglich/sinnvoll, dynamisch die Texturen eines FBOs auszutauschen? Also wenn man jetzt meinetwegen ein FBO mit 6 Rendertargets hat, einfach eins austauschen? Für sowas hätte ich nämlich ein Anwendungsgebiet, habs nur noch nicht ausprobiert.
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.