## Name

glVertexAttribFormat — specify the organization of vertex arrays

## C Specification

`void glVertexAttribFormat(` | GLuint attribindex,
| GLint size,
| GLenum type,
| GLboolean normalized,
| GLuint relativeoffset`)`;

`void glVertexAttribIFormat(` | GLuint attribindex,
| GLint size,
| GLenum type,
| GLuint relativeoffset`)`;

`void glVertexAttribLFormat(` | GLuint attribindex,
| GLint size,
| GLenum type,
| GLuint relativeoffset`)`;

## Parameters

`attribindex`

  The generic vertex attribute array being described.

`size`

  The number of values per vertex that are stored in the array.

`type`

  The type of the data stored in the array.

`normalized`

  The distance between elements within the buffer.

`relativeoffset`

  The distance between elements within the buffer.

## Description

`glVertexAttribFormat`, `glVertexAttribIFormat` and `glVertexAttribLFormat` specify the organization of data in vertex arrays. `attribindex` specifies the index of the generic vertex attribute array whose data layout is being described, and must be less than the value of `GL_MAX_VERTEX_ATTRIBS`.

`size` determines the number of components per vertex are allocated to the specifed attribute and must be 1, 2, 3 or 4. `type` indicates the type of the data. If `type` is one of `GL_BYTE`, `GL_SHORT`, `GL_INT`, `GL_FIXED`, `GL_FLOAT`, `GL_HALF_FLOAT`, and `GL_DOUBLE` indicate types `GLbyte`, `GLshort`, `GLint`, `GLfixed`, `GLfloat`, `GLhalf`, and `GLdouble`, respectively; the values `GL_UNSIGNED_BYTE`, `GL_UNSIGNED_SHORT`, and `GL_UNSIGNED_INT` indicate types `GLubyte`, `GLushort`, and `GLuint`, respectively; the values `GL_INT_2_10_10_10_REV` and `GL_UNSIGNED_INT_2_10_10_10_REV` indicating respectively four signed or unsigned elements packed into a single `GLuint`; and the value `GL_UNSIGNED_INT_10F_11F_11F_REV` indicating three floating point values packed into a single `GLuint`.

`glVertexAttribLFormat` is used to specify layout for data associated with a generic attribute variable declared as 64-bit double precision components. For `glVertexAttribLFormat`, `type` must be `GL_DOUBLE`. In contrast to `glVertexAttribFormat`, which will cause data declared as `GL_DOUBLE` to be converted to 32-bit representation, `glVertexAttribLFormat` causes such data to be left in its natural, 64-bit representation.

For `glVertexAttribFormat`, if `normalized` is `GL_TRUE`, then integer data is normalized to the range [-1, 1] or [0, 1] if it is signed or unsigned, respectively. If `noramlized` is `GL_FALSE` then integer data is directly converted to floating point.

`relativeoffset` is the offset, measured in basic machine units of the first element relative to the start of the vertex buffer binding this attribute fetches from.

`glVertexAttribFormat` should be used to describe vertex attribute layout for floating-point vertex attributes, `glVertexAttribIFormat` should be used to describe vertex attribute layout for integer vertex attribute and `glVertexAttribLFormat` should be used to describe the layout for 64-bit vertex attributes. Data for an array specified by `glVertexAttribIFormat` will always be left as integer values; such data are referred to as pure integers.

## Notes

`GL_UNSIGNED_INT_10F_11F_11F_REV` is accepted for `type` only if the GL version is 4.4 or higher.

## Errors

`GL_INVAILD_VALUE` is generated if `attribindex` is greater than or equal to the value of `GL_MAX_VERTEX_ATTRIBS`.

`GL_INVALID_VALUE` is generated if `size` is not one of the accepted values.

`GL_INVALID_VALUE` is generated if `relativeoffset` is greater than the value of `GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET`.

`GL_INVALID_ENUM` is generated if `type` is not one of the accepted tokens.

`GL_INVALID_OPERATION` is generated if no vertex array object is bound.

## Associated Gets

glGet with arguments `GL_MAX_VERTEX_ATTRIB_BINDINGS`, or `GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET`.

glGetVertexAttrib with argument `GL_VERTEX_ATTRIB_RELATIVE_OFFSET`.

## See Also

glBindVertexBuffer, glVertexAttribBinding, glVertexAttribPointer, glVertexBindingDivisor, glVertexAttribPointer.

## Copyright

Copyright © 2012 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/.