# OpenGL.GL.NV.geometry_program4

OpenGL extension NV.geometry_program4

This module customises the behaviour of the
OpenGL.raw.GL.NV.geometry_program4 to provide a more
Python-friendly API

Overview (from the spec)

NV_geometry_program4 defines a new type of program available to be run on
the GPU, called a geometry program. Geometry programs are run on full
primitives after vertices are transformed, but prior to flat shading and
clipping.

A geometry program begins with a single primitive - a point, line, or
triangle. Quads and polygons are allowed, but are decomposed into
individual triangles prior to geometry program execution. It can read the
attributes of any of the vertex in the primitive and use them to generate
new primitives. A geometry program has a fixed output primitive type,
either a point, a line strip, or a triangle strip. It emits vertices
(using the EMIT opcode) to define the output primitive. The attributes of
emitted vertices are specified by writing to the same set of result
bindings (e.g., "result.position") provided for vertex programs.
Additionally, a geometry program can emit multiple disconnected primitives
by using the ENDPRIM opcode, which is roughly equivalent to calling End
and then Begin again. The primitives emitted by the geometry program are
then clipped and then processed like an equivalent OpenGL primitive
specified by the application.

This extension provides four additional primitive types: lines with
adjacency, line strips with adjacency, separate triangles with adjacency,
and triangle strips with adjacency. Some of the vertices specified in
these new primitive types are not part of the ordinary primitives.
Instead, they represent neighboring vertices that are adjacent to the two
line segment end points (lines/strips) or the three triangle edges
(triangles/tstrips). These "adjacency" vertices can be accessed by
geometry programs and used to match up the outputs of the geometry program
with those of neighboring primitives.

Additionally, geometry programs allow for layered rendering, where entire
three-dimensional, cube map, or array textures (EXT_texture_array) can be
bound to the current framebuffer. Geometry programs can use the
"result.layer" binding to select a layer or cube map face to render to.
Each primitive emitted by such a geometry program is rendered to the layer
taken from its provoking vertex.

Since geometry programs expect a specific input primitive type, an error
will occur if the application presents primtives of a different type. For
example, if an enabled geometry program expects points, an error will
occur at Begin() time, if a primitive mode of TRIANGLES is specified.

The official definition of this extension is available here:
http://www.opengl.org/registry/specs/NV/geometry_program4.txt

## Functions

## Constants

GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT (36263)

GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT (36052)

GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT (36265)

GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT (36264)

GL_GEOMETRY_INPUT_TYPE_EXT (36315)

GL_GEOMETRY_OUTPUT_TYPE_EXT (36316)

GL_GEOMETRY_PROGRAM_NV (35878)

GL_GEOMETRY_VERTICES_OUT_EXT (36314)

GL_LINE_STRIP_ADJACENCY_EXT (11)

GL_LINES_ADJACENCY_EXT (10)

GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT (35881)

GL_MAX_PROGRAM_OUTPUT_VERTICES_NV (35879)

GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV (35880)

GL_PROGRAM_POINT_SIZE_EXT (34370)

GL_TRIANGLE_STRIP_ADJACENCY_EXT (13)

GL_TRIANGLES_ADJACENCY_EXT (12)