chargez la scène de test : rungholt.zip
il y a 2 modèles : la version complète assez volumineuse, et une seule maison, plus rapide à charger et plus simple à manipuler.
toutes les textures sont regroupées dans un seule image (un atlas de textures... rungholt-RGBA.png) ce qui est très simple à manipuler : il suffit de charger l'image et de fabriquer une texture openGL avec, cf read_texture() dans texture.h.
rappel : utilisation de
textures dans les shaders, cf doc
en ligne.



GLuint make_vec3_texture(/* unit */, /* widh */, /* height */, /* texel format */ );
int w, h;
GLuint framebuffer;
GLuint depth;
GLuint color;
GLuint normal;
init( ):
// exercice 1
depth= make_depth_texture( 0, w, h, /* texel format */ );
color= make_vec3_texture( 0, w, h, /* texel format */ );
normal= make_vec3_texture( 0, w, h, /* texel format */ );
...
// exercice 2
glGenFramebuffer(1, &framebuffer);
glBindFramebufer(GL_DRAW_FRAMEBUFFER, framebuffer);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, /* attachment */ GL_COLOR_ATTACHMENT0, /* texture */ color, /* mipmap level */ 0);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, /* attachment */ GL_COLOR_ATTACHMENT1, /* texture */ normal, /* mipmap level */ 0);
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, /* attachment */ GL_DEPTH_ATTACHMENT, /* texture */ depth, /* mipmap level */ 0);
// associer les sorties du fragment shader aux textures attachees au framebuffer
GLenum buffers[]= { /* sortie / location 0 */ GL_COLOR_ATTACHMENT0, /* sortie / location 1 */ GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
// nettoyage...
glBindFramebufer(GL_DRAW_FRAMEBUFFER, 0);
render( ):
// etape 1 :construirele GBuffer // exercice 2
glBindFramebufer(GL_DRAW_FRAMEBUFFER, framebuffer);
glViewport(0, 0, w, h);
glClear( ... )
glUseProgram(program_draw):
...
glDraw( ... ); // dessiner les objets et construire le GBuffer
// etape 2 : evaluer le GBuffer // exercice 3
glBindFramebufer(GL_DRAW_FRAMEBUFFER, 0);
glViewport(0, 0, window_width(), window_height());
glClear( ... )
glUseProgram(program_deferred):
...
glDraw( ... ); // evaluer le GBuffer sur chaque pixel


