Light | Dark

# docs.GL

OpenGL ES 3
OpenGL ES 2

# glGetShaderiv

## Name

glGetShaderiv — return a parameter from a shader object

## C Specification

`void glGetShaderiv(` | GLuint shader,
| GLenum pname,
| GLint *params`)`;

## Parameters

`shader`

  Specifies the shader object to be queried.

`pname`

  Specifies the object parameter. Accepted symbolic names are `GL_SHADER_TYPE`, `GL_DELETE_STATUS`, `GL_COMPILE_STATUS`, `GL_INFO_LOG_LENGTH`, `GL_SHADER_SOURCE_LENGTH`.

`params`

  Returns the requested object parameter.

## Description

`glGetShaderiv` returns in `params` the value of a parameter for a specific shader object. The following parameters are defined:

`GL_SHADER_TYPE`

  `params` returns `GL_VERTEX_SHADER` if `shader` is a vertex shader object, and `GL_FRAGMENT_SHADER` if `shader` is a fragment shader object.

`GL_DELETE_STATUS`

  `params` returns `GL_TRUE` if `shader` is currently flagged for deletion, and `GL_FALSE` otherwise.

`GL_COMPILE_STATUS`

  For implementations that support a shader compiler, `params` returns `GL_TRUE` if the last compile operation on `shader` was successful, and `GL_FALSE` otherwise.

`GL_INFO_LOG_LENGTH`

  For implementations that support a shader compiler, `params` returns the number of characters in the information log for `shader` including the null termination character (i.e., the size of the character buffer required to store the information log). If `shader` has no information log, a value of 0 is returned.

`GL_SHADER_SOURCE_LENGTH`

  For implementations that support a shader compiler, `params` returns the length of the concatenation of the source strings that make up the shader source for the `shader`, including the null termination character. (i.e., the size of the character buffer required to store the shader source). If no source code exists, 0 is returned.

## Notes

Shader compiler support is optional, and thus must be queried before use by calling glGet with argument `GL_SHADER_COMPILER`. glShaderSource, glCompileShader, glGetShaderPrecisionFormat, and glReleaseShaderCompiler will each generate `GL_INVALID_OPERATION` on implementations that do not support a shader compiler, as will `glGetShaderiv` queries of `GL_COMPILE_STATUS`, `GL_INFO_LOG_LENGTH`, and `GL_SHADER_SOURCE_LENGTH`. Such implementations instead offer the glShaderBinary alternative for supplying a pre-compiled shader binary.

If an error is generated, no change is made to the contents of `params`.

## Errors

`GL_INVALID_ENUM` is generated if `pname` is not an accepted value.

`GL_INVALID_VALUE` is generated if `shader` is not a value generated by OpenGL.

`GL_INVALID_OPERATION` is generated if `pname` is `GL_COMPILE_STATUS`, `GL_INFO_LOG_LENGTH`, or `GL_SHADER_SOURCE_LENGTH` but a shader compiler is not supported.

`GL_INVALID_OPERATION` is generated if `shader` does not refer to a shader object.

## Associated Gets

glGet with argument `GL_SHADER_COMPILER`

glGetShaderInfoLog with argument `shader`

glGetShaderSource with argument `shader`

glIsShader

## Examples

Compile a program from a vertex shader and a fragment shader.

    GLuint vshader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vshader, 1, &vertex_shader_source, NULL); // vertex_shader_source is a GLchar* containing glsl shader source code
    glCompileShader(vshader);

    GLint vertex_compiled;
    glGetShaderiv(vshader, GL_COMPILE_STATUS, &vertex_compiled);
    if (vertex_compiled != GL_TRUE)
    {
        GLsizei log_length = 0;
        GLchar message[1024];
        glGetShaderInfoLog(vshader, 1024, &log_length, message);
        // Write the error to a log
    }

    GLuint fshader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fshader, 1, &fragment_shader_source, NULL); // fragment_shader_source is a GLchar* containing glsl shader source code
    glCompileShader(fshader);

    GLint fragment_compiled;
    glGetShaderiv(fshader, GL_COMPILE_STATUS, &fragment_compiled);
    if (fragment_compiled != GL_TRUE)
    {
        GLsizei log_length = 0;
        GLchar message[1024];
        glGetShaderInfoLog(fshader, 1024, &log_length, message);
        // Write the error to a log
    }

    GLuint program = glCreateProgram();

    // This step is unnecessary if you use the location specifier in your shader
    // e.g. layout (location = 0) in vec3 position;
    glBindAttribLocation(program, 0, "position"); // The index passed into glBindAttribLocation is
    glBindAttribLocation(program, 1, "texcoord"); // used by glEnableVertexAttribArray. "position"
    glBindAttribLocation(program, 2, "normal");   // "texcoord" "normal" and "color" are the names of the
    glBindAttribLocation(program, 3, "color");    // respective inputs in your fragment shader.

    glAttachShader(program, vshader);
    glAttachShader(program, fshader);
    glLinkProgram(program);

    GLint program_linked;
    glGetProgramiv(program, GL_LINK_STATUS, &program_linked);
    if (program_linked != GL_TRUE)
    {
        GLsizei log_length = 0;
        GLchar message[1024];
        glGetProgramInfoLog(program, 1024, &log_length, message);
        // Write the error to a log
    }

## See Also

glCompileShader, glCreateShader, glDeleteShader, glGetProgramiv, glShaderSource, glShaderBinary

## Copyright

Copyright © 2003-2005 3Dlabs Inc. Ltd. 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.