Light | Dark

# docs.GL

OpenGL 4
OpenGL 3

# glFramebufferTexture

## Name

glFramebufferTexture — attach a level of a texture object as a logical buffer of a 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`)`;

`void glNamedFramebufferTexture(` | GLuint framebuffer,
| GLenum attachment,
| GLuint texture,
| GLint level`)`;

## Parameters

`target`

  Specifies the target to which the framebuffer is bound for all commands except `glNamedFramebufferTexture`.

`framebuffer`

  Specifies the name of the framebuffer object for `glNamedFramebufferTexture`.

`attachment`

  Specifies the attachment point of the framebuffer.

`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 name of an existing texture object to attach.

`level`

  Specifies the mipmap level of the texture object to attach.

## Description

These commands attach a selected mipmap level or image of a texture object as one of the logical buffers of the specified framebuffer object. Textures cannot be attached to the default draw and read framebuffer, so they are not valid targets of these commands.

For all commands except `glNamedFramebufferTexture`, the framebuffer object is that bound to `target`, which must be `GL_DRAW_FRAMEBUFFER`, `GL_READ_FRAMEBUFFER`, or `GL_FRAMEBUFFER`. `GL_FRAMEBUFFER` is equivalent to `GL_DRAW_FRAMEBUFFER`.

For `glNamedFramebufferTexture`, `framebuffer` is the name of the framebuffer object.

`attachment` specifies the logical attachment of the framebuffer and must be `GL_COLOR_ATTACHMENT` i, `GL_DEPTH_ATTACHMENT`, `GL_STENCIL_ATTACHMENT` or `GL_DEPTH_STENCIL_ATTACHMENT`. i in `GL_COLOR_ATTACHMENT` i may range from zero to the value of `GL_MAX_COLOR_ATTACHMENTS` minus one. 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.

For `glFramebufferTexture1D`, `glFramebufferTexture2D` and `glFramebufferTexture3D`, `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 object with effective target `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 framebuffer attachment point named by `attachment`. For `glFramebufferTexture1D`, `glFramebufferTexture2D`, and `glFramebufferTexture3D`, `texture` must be zero or the name of an existing texture with an effective 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 $log_2$ 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 $log_2$ 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 less than or equal to $log_2$ 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`.

For `glFramebufferTexture` and `glNamedFramebufferTexture`, if `texture` is the name of a three-dimensional, cube map array, cube map, one- or two-dimensional array, or two-dimensional multisample array texture, the specified texture level is an array of images, and the framebuffer attachment is considered to be layered.

## Errors

`GL_INVALID_ENUM` is generated by all commands accepting a `target` parameter if it is not one of the accepted framebuffer targets.

`GL_INVALID_OPERATION` is generated by all commands accepting a `target` parameter if zero is bound to that target.

`GL_INVALID_OPERATION` is generated by `glNamedFramebufferTexture` if `framebuffer` is not the name of an existing framebuffer object.

`GL_INVALID_ENUM` is generated if `attachment` is not one of the accepted attachment points.

`GL_INVALID_VALUE` is generated if `texture` is not zero or the name of an existing texture object.

`GL_INVALID_VALUE` is generated if `texture` is not zero and `level` is not a supported texture level for `texture`.

`GL_INVALID_VALUE` is generated by `glFramebufferTexture3D` if `texture` is not zero and `layer` is larger than the value of `GL_MAX_3D_TEXTURE_SIZE` minus one.

`GL_INVALID_OPERATION` is generated by all commands accepting a `textarget` parameter if `texture` is not zero, and `textarget` and the effective target of `texture` are not compatible.

`GL_INVALID_OPERATION` is generated by if `texture` is a buffer texture.

## 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

## Version Support

| OpenGL Version
--- | ---
Function / Feature Name | 2.0 | 2.1 | 3.0 | 3.1 | 3.2 | 3.3 | 4.0 | 4.1 | 4.2 | 4.3 | 4.4 | 4.5
`glFramebufferTexture` | - | - | - | - | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔
`glFramebufferTexture1D` | - | - | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔
`glFramebufferTexture2D` | - | - | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔
`glFramebufferTexture3D` | - | - | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔
`glNamedFramebufferTexture` | - | - | - | - | - | - | - | - | - | - | - | ✔

## See Also

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

## Copyright

Copyright © 2010-2014 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.