|Core in version||3.2|
A Geometry Shader (GS) is a Shader program written in GLSL that governs the processing of primitives. It happens after primitive assembly, as an additional optional step in that part of the pipeline. A GS can create new primitives, unlike vertex shaders, which are limited to a 1:1 input to output ratio. A GS can also do layered rendering; this means that the GS can specifically say that a primitive is to be rendered to a particular layer of the framebuffer.
Unlike other shader stages, a geometry shader is optional and does not have to be used.
Primitive in/out specification
Each geometry shader is designed to accept a specific Primitive type as input and to output a specific primitive type. The accepted input primitive type is defined in the shader:
The input_primitive type must match the primitive type used with the rendering command that renders with this shader program. The valid values for input_primitive, along with the valid OpenGL primitive types, are:
|GS input||OpenGL primitives||vertex count|
|lines||GL_LINES, GL_LINE_STRIP, GL_LINE_LIST||2|
|triangles||GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN||3|
The vertex count is the number of vertices that the GS receives per-input primitive.
The output primitive type is defined as follows:
layout(output_primitive, max_vertex = vert_count) out;
The output_primitive may be one of the following:
These work exactly the same way their counterpart OpenGL rendering modes do. To output individual triangles or lines, simply use EndPrimitive (see below) between each triangle/line.
There must be a max_vertex declaration for the output. The number must be a compile-time constant, and it defines the maximum number of vertices that will be written by a single invocation of the GS. It may be no larger than the implementation-defined limit of MAX_GEOMETRY_OUTPUT_VERTICES. The minimum value for this limit is 256. See the limitations below.
|Core in version||4.0|
|Core ARB extension||ARB_gpu_shader5|
The GS can also be instanced. This causes the GS to execute multiple times for the same primitive. This is useful for layered rendering and outputs to multiple streams (see below).
To use instancing, there must be an input layout qualifier:
layout(invocations = num_instances) in;
The value of num_instances is a compile-time constant, and must not be larger than MAX_GEOMETRY_SHADER_INVOCATIONS (the minimum implementations will allow is 32). The built-in value gl_InvocationID specifies the particular instance of this shader.
The output primitives from instances are ordered by the gl_InvocationID. So 2 primitives written from 3 instances will create a primitive stream of: (prim0, inst0), (prim0, inst1), (prim0, inst2), (prim1, inst0), ...
|This article is a stub. You can help the OpenGL Wiki by expanding it.|