Computergrafik

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:

glGenFramebuffers  (1, &name_fb);
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:

glFramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, name_tex, 0);

Nun erzeugt man über ein komplexes Zusammenspiel mehrerer OpenGL-Aufrufe einen Depth Buffer der gleichen Größe:

glGenRenderbuffers (1, &name_depth_rb);
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

glBindFramebuffer  (GL_FRAMEBUFFER, name_fb);

In den regulären (angezeigten Framebuffer zeichnet man nach

glBindFramebuffer  (GL_FRAMEBUFFER, 0);

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:

#include <glvertex_fbo_gl.h>
lglFBO fbo;

Und dann in initializeOpenGL():

fbo.setupFBO (512, 512);            // width and height of FBO

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():

fbo.setupFBO (width(), height());   // to have the same of the shown window

Zum rendern in die Textur aktiviert man den FBO:

fbo.activateFBO();

Zum rendern auf den Bildschirm deaktiviert man den FBO, dabei bekommt man den Namen der Textur zurück:

GLint name_fbtex = fbo.deactivateFBO();
glBindTexture (GL_TEXTURE_2D, name_fbtex);


Render to Texture | | Renderbuffer mit Tiefe

Options: