1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
// -- Initialiser OpenGL.
bool init_opengl() {
// Couleur d'arrière plan.
glClearColor(0.1f, 0.7f, 0.7f, 0.f);
// Definir la matrice de projection.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0, (double)WIN_W/WIN_H, 1, 50);
// Activer le test de profondeur.
glEnable(GL_DEPTH_TEST);
glClearDepth(1.f);
// Activer les textures.
glEnable(GL_TEXTURE_2D);
// Regarder si la carte graphique supporte les FBO.
glewInit();
if (!glewIsSupported("GL_EXT_framebuffer_object")) {
std::cerr << "||Erreur|| - FBO non supportes." << std::endl;
return false;
}
return true;
}
// -- Initialiser les ressources.
bool init_resource() {
// Generer une texture, un framebuffer, et un renderbuffer.
glGenTextures(1, &id_tex);
glGenFramebuffersEXT(1, &id_fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id_fbo);
glBindTexture(GL_TEXTURE_2D, id_tex);
// Parametrer la texture.
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, TEX_W, TEX_H, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, id_tex, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
return true;
}
// -- Dessiner la scène.
void draw_scene() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Placer la caméra.
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(3.0, 3.0, 3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
// Rendu offscren du cube.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, id_fbo);
glPushAttrib(GL_VIEWPORT_BIT);
// Empecher l'ecriture dans les tampons de couleur.
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
// Vider les tampons.
glClear(GL_DEPTH_BUFFER_BIT);
// Reglage du viewport.
glViewport(0, 0, BUFF_W, BUFF_H);
// Dessiner ma scène, sale aussi, mais juste là pour tester.
glTranslated(-1, -1, 0);
draw_cube();
glTranslated(1, 1, 0);
glScaled(0.5, 0.5, 0.5);
draw_cube();
glScaled(2, 2, 2);
glPopAttrib();
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE)
std::cerr << "Probleme avec le FBO" << std::endl;
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
// Vider les tampons.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Dessiner le cube sur le plan.
glBindTexture(GL_TEXTURE_2D, id_tex);
glBegin(GL_QUADS);
glColor3f(1.f, 1.f, 1.f);
glTexCoord2d(0,0); glVertex3f(1.f, -1.f, -1.f);
glTexCoord2d(1,0); glVertex3f(1.f, 1.f, -1.f);
glTexCoord2d(1,1); glVertex3f(-1.f, 1.f, -1.f);
glTexCoord2d(0,1); glVertex3f(-1.f, -1.f, -1.f);
glEnd();
// Mise à jour des tampons.
glFlush();
SDL_GL_SwapBuffers();
} |
Partager