Originally Posted by

**GClements**
The most efficient solution is to use flat-qualified vertex shader outputs, so each triangle takes the colour and normal from one of the vertices (by default, the last vertex). That way, you only need (roughly) as many vertices as triangles (rather than 3 vertices per triangle). But constructing the topology is fairly complex if you want to minimise the number of vertices (finding an optimal solution is an exact cover problem, which is NP-complete).

Otherwise, unless memory is particularly tight, I'd just use vertex attributes (you don't need 3 floats for the normal; for lighting, a 16-bit value is perfectly adequate).

Note that you can calculate the face normal in the fragment shader using N=cross(dFdx(p),dFdy(p)), where p is the fragment position in any affine space (object space, world space or eye space, but not NDC). The normal will be in the same space.

Geometry shaders tend to be expensive because they eliminate vertex sharing. But that isn't an issue if you aren't sharing any vertices in the first place.