Light | Dark

# docs.GL

OpenGL 4
OpenGL 3

# glFramebufferTexture

## Name

glFramebufferTexture — 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 be `GL_DRAW_FRAMEBUFFER`, `GL_READ_FRAMEBUFFER`, or `GL_FRAMEBUFFER`. `GL_FRAMEBUFFER` is equivalent to `GL_DRAW_FRAMEBUFFER`.

`attachment`

  Specifies the attachment point of the framebuffer. `attachment` must be `GL_COLOR_ATTACHMENTi`, `GL_DEPTH_ATTACHMENT`, `GL_STENCIL_ATTACHMENT` or `GL_DEPTH_STENCIL_ATTACHMENT`.

`textarget`

  For `glFramebufferTexture1D`, `glFramebufferTexture2D` and `glFramebufferTexture3D`, specifies what type of texture is expected in the `texture` 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_ATTACHMENT`. i in `GL_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 type `textarget`, 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 be `GL_TEXTURE_3D`.

## Notes

`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.

## Examples

Create a framebuffer object with a texture-based color attachment and a texture-based depth attachment. Using texture-based attachments allows sampling of those textures in shaders.

    // fbo_width and fbo_height are the desired width and height of the FBO.
    // For Opengl <= 4.4 or if the GL_ARB_texture_non_power_of_two extension
    // is present, fbo_width and fbo_height can be values other than 2^n for
    // some integer n.

    // Build the texture that will serve as the color attachment for the framebuffer.
    GLuint texture_map;
    glGenTextures(1, &texture_map);
    glBindTexture(GL_TEXTURE_2D, texture_map);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fbo_width, fbo_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);

    glBindTexture(GL_TEXTURE_2D, 0);

    // Build the texture that will serve as the depth attachment for the framebuffer.
    GLuint depth_texture;
    glGenTextures(1, &depth_texture);
    glBindTexture(GL_TEXTURE_2D, depth_texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, fbo_width, fbo_height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
    glBindTexture(GL_TEXTURE_2D, 0);

    // Build the framebuffer.
    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, (GLuint)framebuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_map, 0);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0);

    GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if (status != GL_FRAMEBUFFER_COMPLETE)
        // Error

    glBindFramebuffer(GL_FRAMEBUFFER, 0);

## Tutorials

Songho - OpenGL Frame Buffer Object (FBO)
open.gl - Framebuffers
opengl-tutorial.org - Tutorial 14 : Render To Texture
opengl-tutorial.org - Tutorial 16 : Shadow mapping

## See Also

glGenFramebuffers, glBindFramebuffer, glGenRenderbuffers, glFramebufferTexture, glFramebufferTexture1D, glFramebufferTexture2D, glFramebufferTexture3D

## Copyright

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. https://opencontent.org/openpub/.

Think you can improve this page? Edit this page on GitHub.