Name
glFramebufferTexture2D — attach a level of a texture object as a logical buffer to the currently bound framebuffer object
C Specification
void glFramebufferTexture( | GLenum target, |
GLenum attachment, | |
GLuint texture, | |
GLint level) ; |
void glFramebufferTexture1D( | GLenum target, |
GLenum attachment, | |
GLenum textarget, | |
GLuint texture, | |
GLint level) ; |
void glFramebufferTexture2D( | GLenum target, |
GLenum attachment, | |
GLenum textarget, | |
GLuint texture, | |
GLint level) ; |
void glFramebufferTexture3D( | GLenum target, |
GLenum attachment, | |
GLenum textarget, | |
GLuint texture, | |
GLint level, | |
GLint layer) ; |
Parameters
target
- Specifies the framebuffer target.
target
must beGL_DRAW_FRAMEBUFFER
,GL_READ_FRAMEBUFFER
, orGL_FRAMEBUFFER
.GL_FRAMEBUFFER
is equivalent toGL_DRAW_FRAMEBUFFER
. attachment
- Specifies the attachment point of the framebuffer.
attachment
must beGL_COLOR_ATTACHMENTi
,GL_DEPTH_ATTACHMENT
,GL_STENCIL_ATTACHMENT
orGL_DEPTH_STENCIL_ATTACHMMENT
. textarget
- For
glFramebufferTexture1D
,glFramebufferTexture2D
andglFramebufferTexture3D
, specifies what type of texture is expected in thetexture
parameter, or for cube map textures, which face is to be attached. texture
- Specifies the texture object to attach to the framebuffer attachment point named by
attachment
. level
- Specifies the mipmap level of
texture
to attach.
Description
glFramebufferTexture
, glFramebufferTexture1D
, glFramebufferTexture2D
, and glFramebufferTexture
attach a selected mipmap level or image of a texture object as one of the logical buffers of the framebuffer object currently bound to target
. target
must be GL_DRAW_FRAMEBUFFER
, GL_READ_FRAMEBUFFER
, or GL_FRAMEBUFFER
. GL_FRAMEBUFFER
is equivalent to GL_DRAW_FRAMEBUFFER
.attachment
specifies the logical attachment of the framebuffer and must be GL_COLOR_ATTACHMENTi
, GL_DEPTH_ATTACHMENT
, GL_STENCIL_ATTACHMENT
or GL_DEPTH_STENCIL_ATTACHMMENT
. i inGL_COLOR_ATTACHMENTi
may range from zero to the value of GL_MAX_COLOR_ATTACHMENTS
- 1. Attaching a level of a texture to GL_DEPTH_STENCIL_ATTACHMENT
is equivalent to attaching that level to both the GL_DEPTH_ATTACHMENT
and the GL_STENCIL_ATTACHMENT
attachment points simultaneously.textarget
specifies what type of texture is named by texture
, and for cube map textures, specifies the face that is to be attached. If texture
is not zero, it must be the name of an existing texture with typetextarget
, unless it is a cube map texture, in which case textarget
must be GL_TEXTURE_CUBE_MAP_POSITIVE_X
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
, GL_TEXTURE_CUBE_MAP_POSITIVE_Y
,GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
, GL_TEXTURE_CUBE_MAP_POSITIVE_Z
, or GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
.If
texture
is non-zero, the specified level
of the texture object named texture
is attached to the framebfufer attachment point named by attachment
. For glFramebufferTexture1D
,glFramebufferTexture2D
, and glFramebufferTexture3D
, texture
must be zero or the name of an existing texture with a target of textarget
, or texture
must be the name of an existing cube-map texture and textarget
must be one of GL_TEXTURE_CUBE_MAP_POSITIVE_X
, GL_TEXTURE_CUBE_MAP_POSITIVE_Y
, GL_TEXTURE_CUBE_MAP_POSITIVE_Z
, GL_TEXTURE_CUBE_MAP_NEGATIVE_X
,GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
, or GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
.If
textarget
is GL_TEXTURE_RECTANGLE
, GL_TEXTURE_2D_MULTISAMPLE
, or GL_TEXTURE_2D_MULTISAMPLE_ARRAY
, then level
must be zero. If textarget
is GL_TEXTURE_3D
, then level must be greater than or equal to zero and less than or equal to log2 of the value of GL_MAX_3D_TEXTURE_SIZE
. If textarget
is one of GL_TEXTURE_CUBE_MAP_POSITIVE_X
, GL_TEXTURE_CUBE_MAP_POSITIVE_Y
,GL_TEXTURE_CUBE_MAP_POSITIVE_Z
, GL_TEXTURE_CUBE_MAP_NEGATIVE_X
, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
, or GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, then level
must be greater than or equal to zero and less than or equal to log2 of the value of GL_MAX_CUBE_MAP_TEXTURE_SIZE
. For all other values of textarget
, level
must be greater than or equal to zero and no larger than log2 of the value of GL_MAX_TEXTURE_SIZE
.layer
specifies the layer of a 2-dimensional image within a 3-dimensional texture.For
glFramebufferTexture1D
, if texture
is not zero, then textarget
must be GL_TEXTURE_1D
. For glFramebufferTexture2D
, if texture
is not zero, textarget
must be one of GL_TEXTURE_2D
,GL_TEXTURE_RECTANGLE
, GL_TEXTURE_CUBE_MAP_POSITIVE_X
, GL_TEXTURE_CUBE_MAP_POSITIVE_Y
, GL_TEXTURE_CUBE_MAP_POSITIVE_Z
, GL_TEXTURE_CUBE_MAP_NEGATIVE_X
,GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
, or GL_TEXTURE_2D_MULTISAMPLE
. For glFramebufferTexture3D
, if texture
is not zero, then textarget
must beGL_TEXTURE_3D
.Notes on glFramebufferTexture2D
glFramebufferTexture
is available only if the GL version is 3.2 or greater.Errors
GL_INVALID_ENUM
is generated if target
is not one of the accepted tokens.GL_INVALID_ENUM
is generated if renderbuffertarget
is not GL_RENDERBUFFER
.GL_INVALID_OPERATION
is generated if zero is bound to target
.GL_INVALID_OPERATION
is generated if textarget
and texture
are not compatible.See Also
glGenFramebuffers, glBindFramebuffer, glGenRenderbuffers, glFramebufferTexture, glFramebufferTexture1D, glFramebufferTexture2D, glFramebufferTexture3DCopyright
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 glFramebufferTexture2D
// 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);
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);
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);
}