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 ...