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

Aktuelle Zeit: Sa Jul 12, 2025 23:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Framebuffer / Renderbuffer
BeitragVerfasst: Mo Dez 01, 2008 07:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab bisher eigentlich schon ne menge mit den Framebuffern gemacht, aber es gibt seit anfang an eine sache die ich bei den dingern nicht verstehe.. wozu gibt es diese Renderbuffer?

Wenn ich z.B. meine Scene in eine textur rendern will, erstell ich mir einen Framebuffer etwa so:

Code:
  1.     GLuint tex = createTexture(...);
  2.     glGenFramebuffersEXT(1, &framebuffer);
  3.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
  4.     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);


Wozu gibt es aber jetzt diese Renderbuffer? (glGenRenderbufferEXT, glBindRenderbufferEXT etc)
Wann brauche ich die? :)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 08:30 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hab ich auch noch nicht gebraucht, aber glücklicherweise kann ich in einem Buch nachsehen:
Zitat aus "OpenGL Superbible", Seite 609, übersetzt aus dem Englischen:

1. Framebuffers (FBOs) sind nicht auf die Größe eines Fensters beschränkt
2. Texturen könen zu einem FBO hinzugefügt werden, dadurch wird das direkte Zeichnen auf Texturen ermöglicht, ohne explizit "glCopyTexImage" zu benutzen
3. FBOs können mehrere Farbpuffer beinhalten, auf die gleichzeitig*) von einem Fragmentshader zugegriffen werden kann

*) Ich weiß jetzt nicht ob gleichzeitig bedeuted: parallel aber wahrscheinlich nicht, denn es war von "einem" Fragmentshader die Rede, und das ganze Kapitel habe ich nicht durchgelesen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 08:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

mhh... das beantwortet aber nicht meine frage.. :/
Was Framebuffer sind und wie man die verwendet weiß ich ja... mir geht es aber um die Renderbuffer..

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 09:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Die 2 Extensions kenne ich garnicht und google auch nicht (1 treffer).
Keine Ahnung wozu die gut sein soll und stell mal deine Extensionbefehle auf ARB um, sonnst könnte es auf verschiedenen Karten zu Problemen kommen.
FBO rockt.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 10:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bei solchen Fragen kann ich immer nur die jeweilige Spezifikation der Extension empfehlen. Im Fall von FBOs mit über 400kb (plain text) zwar kein Leichtgewicht aber immerhin sehr vollständig.

Also wenn ich das richtig verstanden habe, dann kannst du an einem FBO verschiedene Buffer anhängen. Color, Stencil, Depth. Und dabei kannst du selber unterscheiden ob du diese Buffer als Texturen benutzen möchtest oder ob diese nur normale Statebuffer sein sollen. Wenn die Buffer als Texturen benutzt werden, dann schreibt das FBO die Daten in die entsprechende Textur. Allerdings kann es auch sein, dass du evtl einen Buffer benutzen möchtest der aber nicht zwingend als Textur vorhanden sein muss (eventuelle geschwindigkeitsvorteile). Bei Colorbuffern ist dies normal wohl eher nicht so sinnvoll. Sondern eher für Stencil und Depth gedacht. Wobei Depth auch als Textur ganz sinnvoll sein kann. Die Renderbuffer können wohl auch problemlos in mehreren FBOs benutzt werden.

Hier auch noch mal ein Beispiel aus der Spezifikation.
Code:
  1.     (7) Render to depth texture with no color attachments
  2.  
  3.         // Given:  depth_tex - TEXTURE_2D depth texture object
  4.         //         fb        - framebuffer object
  5.  
  6.         // Enable render-to-texture
  7.         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
  8.  
  9.         // Set up depth_tex for render-to-texture
  10.         glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
  11.                                   GL_DEPTH_ATTACHMENT_EXT,
  12.                                   GL_TEXTURE_2D, depth_tex, 0);
  13.  
  14.         // No color buffer to draw to or read from
  15.         glDrawBuffer(GL_NONE);
  16.         glReadBuffer(GL_NONE);
  17.  
  18.         // Check framebuffer completeness at the end of initialization.
  19.         CHECK_FRAMEBUFFER_STATUS();
  20.  
  21.         <draw something>
  22.  
  23.         // Re-enable rendering to the window
  24.         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  25.  
  26.         glBindTexture(GL_TEXTURE_2D, depth_tex);
  27.         <draw to the window, reading from the depth_tex>


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 11:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Man soll doch immer alles zu Ende lesen.

In meinem oben zitierten Buch steht: "FBOs sind nur ein Container für Bilder." und weiter:

"Womit werden wir unseren leeren Container füllen? Es gibt zwei Typen von Bildern, die zu einem FBO hinzugefügt werden können. Erstens: Texturen. Zweitens: Renderbuffer. Sowohl Texturen als auch Renderbuffer dienen als Render-Target. Der Hauptunterschied ist, dass Renderbuffer nicht anschließend für Texturierung verwendet werden können. Man kann zwar Tiefen-Texturen ("depth textures") erzeugen, aber es gibt keine Stencil-Texturen. Wenn daher also ein Stencil-Puffer-Zusatz gebraucht wird (Originaltext: "if you need a stencil buffer attachment"), oder sie eben keine Textur brauchen, können sie Renderbuffer verwenden."

Du bist wohl noch immer bei den Shadowmaps, was? So wie das Beispiel in meinem Buch aussieht, verwendet er den RenderBuffer um das Antialiasing der Shadowmap zu verbessern, weil er hier eine höhere Auflösung fahren kann als bei der einfachen Shadowmap-Variante.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 12:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Also entweder hab ich den Faden verloren oder ihr redet am Thema vorbei.
Ich hab es so verstanden, dass Aya wissen will, was glGenRenderbufferEXT, glBindRenderbufferEXT machen und nicht was FBO allgemein kann oder wie man es nutzt.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 13:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich glaube du hast den Faden verlohren. ;)

glGenRenderbuffersEXT etc ist ein Teil von FrameBufferObjects. Und das dient dazu um einen Buffer (RenderBuffer) in einem FBO benutzen zu können der keine Textur ist. Denn an einem FBO kannst du entweder Texturen anhängen oder eben diese RenderBuffer. Nur wenn man keinen Stencil oder Tiefenbuffer in einem FBO benötigt, dann reichen Texturen vollkommen aus. Weswegen diese RenderBuffer ziemlich überflüssig aussehen. Und ich meine das ist das was Aya wissen wollte.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Dez 01, 2008 14:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
@Tak: Frag mich nicht. Ich hab keine Ahnung davon. Ich versuche bloß, ein Buch zu interpretieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 09:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wieso sollte ich den Stencil oder Tiefenpuffer nicht als Textur hinterlegen, dass macht für mich mal garkein Sinn.
Ich denke mal, dass war der Vorreiter von ÜberBuffer,Super Buffer bzw. PBuffer.
Gibs die Extension/ARB denn noch in OpenGL 3.0 ?

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Dez 02, 2008 10:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Wieso sollte ich den Stencil oder Tiefenpuffer nicht als Textur hinterlegen, dass macht für mich mal garkein Sinn.

Nicht jeder mag das Gleiche machen. Was ist, wenn du ein 3D Objekt als Sprite benutzen möchtest. Zum Erstellen der Texture würdest du einen Tiefenbuffer benötigen, da das Ergebniss sonst schlicht falsch wäre. Entsprechend benötigst du nur wärend des Zeichnens einen Tiefenbuffer. Danach wäre es egal. Der Unterschied zwischen angehängter Textur oder RenderBuffer ist verschwindend gering. Könnte mir auch gut vorstellen, dass solch ein RenderBuffer vielleicht andere Optimierungen zulässt als eine Textur das zulassen würde. Innerhalb des Treibers versteht sich. Allerdings ist das eher eine Diskussion über das Für und Wider. Die könnte man ewig weit ausholen und auch auf die ein oder andere Erweiterung fortsetzen.

So wie ich das verstanden habe kannst du den Stencil Buffer auch nur als RenderBuffer anhängen. Eine Stencil Textur würde so nicht gehen. Auf Basis der EXT Variante. Mit der ARB weiß ich das nicht.

Zitat:
Gibs die Extension/ARB denn noch in OpenGL 3.0 ?

Du meinst die FBO Extension? Die ARB Variante wurde erstmal mit der Spezifikation von 3.0 eingeführt (enthält dann auch die blit bzw multisample Erweiterung der EXT Variante). Die ARB Variante gehört auch zum Kern von 3.0. Wobei sich die Methoden des 3.0 Kerns und die entsprechenden ARB Erweiterungen die selben Funktionsnamen teilen. Also sind nicht nur die Pointer gleich sondern bei den ARB Varianten wurde das ARB im Namen weggelassen. Zu mindst laut dem Header von Opengl.org.


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 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]