Light | Dark

# docs.GL

OpenGL 4
OpenGL 3

# glBindFragDataLocation

## Name

glBindFragDataLocation — bind a user-defined varying out variable to a fragment shader color number

## C Specification

`void glBindFragDataLocation(` | GLuint program,
| GLuint colorNumber,
| const char * name`)`;

## Parameters

`program`

  The name of the program containing varying out variable whose binding to modify

`colorNumber`

  The color number to bind the user-defined varying out variable to

`name`

  The name of the user-defined varying out variable whose binding to modify

## Description

`glBindFragDataLocation` explicitly specifies the binding of the user-defined varying out variable `name` to fragment shader color number `colorNumber` for program `program`. If `name` was bound previously, its assigned binding is replaced with `colorNumber`. `name` must be a null-terminated string. `colorNumber` must be less than `GL_MAX_DRAW_BUFFERS`.

The bindings specified by `glBindFragDataLocation` have no effect until `program` is next linked. Bindings may be specified at any time after `program` has been created. Specifically, they may be specified before shader objects are attached to the program. Therefore, any name may be specified in `name`, including a name that is never used as a varying out variable in any fragment shader object. Names beginning with `gl_` are reserved by the GL.

In addition to the errors generated by `glBindFragDataLocation`, the program `program` will fail to link if:

- The number of active outputs is greater than the value `GL_MAX_DRAW_BUFFERS`.

- More than one varying out variable is bound to the same color number.

## Notes

Varying out varyings may have indexed locations assigned explicitly in the shader text using a `location` layout qualifier. If a shader statically assigns a location to a varying out variable in the shader text, that location is used and any location assigned with `glBindFragDataLocation` is ignored.

## Errors

`GL_INVALID_VALUE` is generated if `colorNumber` is greater than or equal to `GL_MAX_DRAW_BUFFERS`.

`GL_INVALID_OPERATION` is generated if `name` starts with the reserved `gl_` prefix.

`GL_INVALID_OPERATION` is generated if `program` is not the name of a program object.

## Associated Gets

glGetFragDataLocation with a valid program object and the the name of a user-defined varying out variable

## Examples

Retrieve uniform data after the shader has been compiled

    // The index returned from these GLint functions gets passed to glEnableVertexAttribArray during rendering.
    GLint position_attrib_index = glGetAttribLocation(program, "position"); // program is what is returned by glCreateProgram.
    GLint texcoord_attrib_index = glGetAttribLocation(program, "texcoord");
    GLint normal_attrib_index = glGetAttribLocation(program, "normal");
    GLint color_attrib_index = glGetAttribLocation(program, "color");

    glBindFragDataLocation(program, 0, "output_color"); // "output_color" is an output value in your vertex shader and an input value in your fragment shader.

    GLint num_uniforms;
    glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &num_uniforms);
    GLchar uniform_name[256];
    GLsizei length;
    GLint size;
    GLenum type;
    for (int i = 0; i < num_uniforms; i++)
    {
        glGetActiveUniform(program, i, sizeof(uniform_name), &length, &size, &type, uniform_name);
        // ... save this uniform data so it can be used during rendering
    }

## Tutorials

open.gl - Framebuffers
open.gl - Geometry Shaders
open.gl - The Graphics Pipeline

## 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
`glBindFragDataLocation` | - | - | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔

## See Also

glCreateProgram, glGetFragDataLocation

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