Inputs and outputs
Besides the usual inputs and outputs (uniforms and vertex attributes), there are new elements that need to be considered.
Primitives, our main input and output element, are complex, and because of that we have to be careful and specify very well what we are doing at each time. The primitive type specified in the geometry shader must match exactly with the primitive that we are drawing (using a GL call like glDrawArrays
, for instance). This means that we cannot happily write a general purpose geometry shader for everything. Also, we have to specify the primitive type and the number of vertices that will be emitted (created) statically in the shader.
For these purposes, we have the layout
keyword. With it, we could define an input and an output layout. As an example, we could do something similar to the following:
layout(triangles) in; layout(triangle_strip, max_vertices = 6) out;
Options for an input layout are as follows:
points
lines
(this includes primitives drawn asGL_LINES...