Name
glBindFramebuffer — bind a framebuffer to a framebuffer target - GL_FRAMEBUFFER
C Specification
void glBindFramebuffer( | GLenum | target, |
GLuint | framebuffer) ; |
Parameters
target
- Specifies the framebuffer target of the binding operation.
framebuffer
- Specifies the name of the framebuffer object to bind.
Description
glBindFramebuffer
binds the framebuffer object with name framebuffer
to the framebuffer target specified by target
. target
must be either GL_DRAW_FRAMEBUFFER
, GL_READ_FRAMEBUFFER
or GL_FRAMEBUFFER
. If a framebuffer object is bound to GL_DRAW_FRAMEBUFFER
or GL_READ_FRAMEBUFFER
, it becomes the target for rendering or readback operations, respectively, until it is deleted or another framebuffer is bound to the corresponding bind point. Calling glBindFramebuffer
with target
set to GL_FRAMEBUFFER
binds framebuffer
to both the read and draw framebuffer targets. framebuffer
is the name of a framebuffer object previously returned from a call to glGenFramebuffers, or zero to break the existing binding of a framebuffer object to target
.Errors
GL_INVALID_ENUM
is generated if target
is not GL_DRAW_FRAMEBUFFER
, GL_READ_FRAMEBUFFER
or GL_FRAMEBUFFER
.GL_INVALID_OPERATION
is generated if framebuffer
is not zero or the name of a framebuffer previously returned from a call to glGenFramebuffers.See Also
glGenFramebuffers, glDeleteFramebuffers, glFramebufferRenderbuffer, glFramebufferTexture, glFramebufferTexture1D, glFramebufferTexture2D, glFramebufferTexture3D,glFramebufferTextureFace, glFramebufferTextureLayer, glIsFramebufferCopyright
Copyright © 2010 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. http://opencontent.org/openpub/.Example of GL_FRAMEBUFFER
// This function does any needed initialization on the rendering
// context.
void SetupRC()
{
fprintf(stdout, "FBO Draw Buffers Demo\n\n");
// Make sure required functionality is available: cube maps, auto mip gen, etc.
if (!GLEE_VERSION_1_4)
{
fprintf(stderr, "OpenGL 1.4 is not available!\n");
Sleep(2000);
exit(0);
}
if (GLEE_ARB_texture_non_power_of_two)
{
npotTexturesAvailable = GL_TRUE;
}
else
{
fprintf(stderr, "GL_ARB_texture_non_power_of_two extension is not available!\n");
fprintf(stderr, "Framebuffer effects will be lower resolution (lower quality).\n\n");
}
if (!GLEE_EXT_framebuffer_object)
{
fprintf(stderr, "GL_EXT_framebuffer_object extension is unavailable!\n");
Sleep(2000);
exit(0);
}
// we'll use up to 4 render targets if they're available
glGetIntegerv(GL_MAX_DRAW_BUFFERS, &maxDrawBuffers);
glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &maxColorAttachments);
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTexUnits);
maxDrawBuffers = (maxDrawBuffers > maxColorAttachments) ? maxColorAttachments : maxDrawBuffers;
maxDrawBuffers = (maxDrawBuffers > (maxTexUnits-1)) ? (maxTexUnits-1) : maxDrawBuffers;
maxDrawBuffers = (maxDrawBuffers > 4) ? 4 : maxDrawBuffers;
if (((!GLEE_ARB_draw_buffers || !GLEE_ARB_fragment_shader || !GLEE_ARB_shader_objects)
&& !GLEE_VERSION_2_0) || (maxDrawBuffers != 4))
{
fprintf(stderr, "Support for at least 4 draw buffers is unavailable!\n");
Sleep(2000);
exit(0);
}
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE_EXT, &maxRenderbufferSize);
maxTexSize = (maxRenderbufferSize > maxTexSize) ? maxTexSize : maxRenderbufferSize;
fprintf(stdout, "Controls:\n");
fprintf(stdout, "\tRight-click for menu\n\n");
fprintf(stdout, "\tx/X\t\tMove +/- in x direction\n");
fprintf(stdout, "\ty/Y\t\tMove +/- in y direction\n");
fprintf(stdout, "\tz/Z\t\tMove +/- in z direction\n\n");
fprintf(stdout, "\td/D\t\tToggle use of draw buffers\n\n");
fprintf(stdout, "\tq\t\tExit demo\n\n");
// Black background
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
// Hidden surface removal
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
// Set up some lighting state that never changes
glShadeModel(GL_SMOOTH);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glMaterialfv(GL_FRONT, GL_SPECULAR, specularLight);
glMateriali(GL_FRONT, GL_SHININESS, 128);
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_NORMALIZE);
glEnable(GL_LIGHT0);
// Set up textures & shaders
SetupTextures();
SetupShaders();
// Set up some renderbuffer state
glGenRenderbuffersEXT(1, &renderbufferID);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbufferID);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT32, fboWidth, fboHeight);
glGenFramebuffersEXT(2, framebufferID);
//glBindFramebuffer(GL_FRAMEBUFFER, framebufferID[0]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[0]);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, renderbufferID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderTextureID[0], 0);
//glBindFramebuffer(GL_FRAMEBUFFER, framebufferID[1]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebufferID[1]);
for (int i = 0; i < maxDrawBuffers; i++)
{
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, renderTextureID[i+1], 0);
}
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}