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
|
GLuint glsl_fbo_create(t_texture *tex, t_u_int32 width, t_u_int32 height, bool bDepth) {
int WindowSizeWidth = (int) width;
int WindowSizeHeight = (int) height;
GLuint fbo;
GLenum status;
// On utilise GLEW pour avoir acces aux fonctions
GLenum err = glewInit();
if (GLEW_OK != err)
{
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
return 0;
}
// Nous voulons au minimum la version 2 (shader et FBO en extension)
if (!GLEW_VERSION_2_0)
{
fprintf(stderr, "OpenGL 2 is not supported\n");
}
glGenFramebuffersEXT(1, &fbo);
GLH_CHECKERROR();
if (bDepth) {
GLuint depth_rb;
// Create a render buffer for the depth
glGenRenderbuffersEXT(1, &depth_rb);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth_rb);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, width, height);
GLH_CHECKERROR();
glBindRenderbuffer(GL_RENDERBUFFER,0);
GLH_CHECKERROR();
// Attach depth buffer to FBO
// Attachement des donnees au FBO
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
GLH_CHECKERROR();
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, tex->target, tex->handle,0);
GLH_CHECKERROR();// Attach depth buffer to FBO
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb);
GLH_CHECKERROR();
status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
GLH_CHECKERROR();
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
}
else {
glDisable(GL_DEPTH_TEST);
}
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glHint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
GLH_CHECKERROR();
status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
return fbo;
} |
Partager