Renderbuffer Objekte
← Render to Texture | ● | Renderbuffer mit Tiefe →
Man erstellt einen Namen für eine Zusammensetzung eines Framebuffers (der reguläre ist wie üblich einfach ‘0’), und aktiviert diesen:
glBindFramebuffer (GL_FRAMEBUFFER, name_fb);
Man benötigt eine Textur in die man zeichnen möchte; man kann über glTexImage2D()
eine leere Textur einer bestimmten Größe erstellen, indem man 0
als Zeiger auf die Bilddaten übergibt. Texturfilter nicht vergessen, MipMapping ist hier erst einmal nicht erlaubt.
Man bindet dann die Textur in die man zeichnen möchte an diesen Render buffer:
Nun erzeugt man über ein komplexes Zusammenspiel mehrerer OpenGL-Aufrufe einen Depth Buffer der gleichen Größe:
glBindRenderbuffer (GL_RENDERBUFFER, name_depth_rb);
glRenderbufferStorage (GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, name_depth_rb);
Ab sofort kann man in diese Textur zeichnen mit
In den regulären (angezeigten Framebuffer zeichnet man nach
Unter qt funktioniert der letzte Schritt so nicht, da qt selber für die Verdeckungsberechnung einen Renderbuffer nutzt. Hier merkt man sich die vorherige Konfiguration, und stellt diese wieder her (siehe demo).
Attach:Lectures/Renderbuffer.png Δ
Im Framework
Im Framework ist das ganze noch etwas einfacher:
lglFBO fbo;
Und dann in initializeOpenGL():
Nur für Postprocessing benötigt man die Textur in der gleichen Größe wie das dargestellte Fenster; da sich die Größe zur Laufzeit ändern kann, macht man das in renderOpenGL():
Zum rendern in die Textur aktiviert man den FBO:
Zum rendern auf den Bildschirm deaktiviert man den FBO, dabei bekommt man den Namen der Textur zurück:
glBindTexture (GL_TEXTURE_2D, name_fbtex);
← Render to Texture | ● | Renderbuffer mit Tiefe →