Light | Dark

# docs.GL

OpenGL 4
OpenGL 3
OpenGL 2
OpenGL ES 3
OpenGL ES 2

# glDrawArrays

## Name

glDrawArrays — render primitives from array data

## C Specification

`void glDrawArrays(` | GLenum | mode,
| GLint | first,
| GLsizei | count`)`;

## Parameters

`mode`

  Specifies what kind of primitives to render. Symbolic constants `GL_POINTS`, `GL_LINE_STRIP`, `GL_LINE_LOOP`, `GL_LINES`, `GL_TRIANGLE_STRIP`, `GL_TRIANGLE_FAN`, `GL_TRIANGLES`, `GL_QUAD_STRIP`, `GL_QUADS`, and `GL_POLYGON` are accepted.

`first`

  Specifies the starting index in the enabled arrays.

`count`

  Specifies the number of indices to be rendered.

## Description

`glDrawArrays` specifies multiple geometric primitives with very few subroutine calls. Instead of calling a GL procedure to pass each individual vertex, normal, texture coordinate, edge flag, or color, you can prespecify separate arrays of vertices, normals, and colors and use them to construct a sequence of primitives with a single call to `glDrawArrays`.

When `glDrawArrays` is called, it uses `count` sequential elements from each enabled array to construct a sequence of geometric primitives, beginning with element `first`. `mode` specifies what kind of primitives are constructed and how the array elements construct those primitives. If `GL_VERTEX_ARRAY` is not enabled, no geometric primitives are generated.

Vertex attributes that are modified by `glDrawArrays` have an unspecified value after `glDrawArrays` returns. For example, if `GL_COLOR_ARRAY` is enabled, the value of the current color is undefined after `glDrawArrays` executes. Attributes that aren't modified remain well defined.

## Notes

`glDrawArrays` is available only if the GL version is 1.1 or greater.

`glDrawArrays` is included in display lists. If `glDrawArrays` is entered into a display list, the necessary array data (determined by the array pointers and enables) is also entered into the display list. Because the array pointers and enables are client-side state, their values affect display lists when the lists are created, not when the lists are executed.

## Errors

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

`GL_INVALID_VALUE` is generated if `count` is negative.

`GL_INVALID_OPERATION` is generated if a non-zero buffer object name is bound to an enabled array and the buffer object's data store is currently mapped.

`GL_INVALID_OPERATION` is generated if `glDrawArrays` is executed between the execution of glBegin and the corresponding glEnd.

## Examples

Render a vertex array (not loaded into OpenGL) using texture UV, color, and normal vertex attributes.

    glEnableVertexAttribArray(texcoord_attrib_index); // Attribute indexes were received from calls to glGetAttribLocation, or passed into glBindAttribLocation.
    glEnableVertexAttribArray(normal_attrib_index);
    glEnableVertexAttribArray(color_attrib_index);
    glEnableVertexAttribArray(position_attrib_index);

    glVertexAttribPointer(texcoord_attrib_index, 2, GL_FLOAT, false, 0, texcoords_data); // texcoords_data is a float*, 2 per vertex, representing UV coordinates.
    glVertexAttribPointer(normal_attrib_index, 3, GL_FLOAT, false, 0, normals_data); // normals_data is a float*, 3 per vertex, representing normal vectors.
    glVertexAttribPointer(color_attrib_index, 3, GL_UNSIGNED_BYTE, true, sizeof(unsigned char)*3, colors_data); // colors_data is a unsigned char*, 3 per vertex, representing the color of each vertex.
    glVertexAttribPointer(position_attrib_index, 3, GL_FLOAT, false, 0, vertex_data); // vertex_data is a float*, 3 per vertex, representing the position of each vertex

    glDrawArrays(GL_TRIANGLES, 0, vertex_count); // vertex_count is an integer containing the number of indices to be rendered

    glDisableVertexAttribArray(position_attrib_index);
    glDisableVertexAttribArray(texcoord_attrib_index);
    glDisableVertexAttribArray(normal_attrib_index);
    glDisableVertexAttribArray(color_attrib_index);

## Tutorials

Songho - OpenGL Vertex Array
open.gl - Depth and Stencil Buffers
open.gl - The Graphics Pipeline

## See Also

glArrayElement, glColorPointer, glDrawElements, glDrawRangeElements, glEdgeFlagPointer, glFogCoordPointer, glGetPointerv, glIndexPointer, glInterleavedArrays, glNormalPointer, glSecondaryColorPointer, glTexCoordPointer, glVertexPointer

## Copyright

Copyright © 1991-2006 Silicon Graphics, Inc. This document is licensed under the SGI Free Software B License. For details, see https://web.archive.org/web/20171022161616/http://oss.sgi.com/projects/FreeB/.

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