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);

Im Framework

Im Framework ist das ganze noch etwas einfacher:

#include <glvertex_fbo.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 bzw. Id der Textur zurück:

GLint name_fbtex = fbo.deactivateFBO();

Diese Textur-Id kann man nun wie jedes andere Textur-Objekt verwenden und z.B. als aktuelle Textur binden etc.

Render to Texture | | Renderbuffer mit Tiefe

Options: