Let's discuss the main innovations from left to right. First of all, uniform (with identical features) access to textures is now possible at three pipeline stages — at the stage of a vertex shader, then at the stage of geometry shader, and certainly at the stage of a pixel shader. Samplers are accessible at all stages, they allow to select several neighbouring values from a texture by a single calculated texture coordinate, which may help significantly facilitate implementation of custom filtering algorithms or operations with non-trivial data representations and special maps. The usual stage of a vertex shader is followed by geometry shader. What is it? It's a shader that manages triangles (assembled from vertices) as entities before they are drawn. That is it can manipulate triangles as objects. Including some control or additional vertex parameters. It can change these parameters, calculate new parameters, specific for the triangle as a whole, and then pass them to a pixel shader. It can mark a triangle with a predicate (and then process it differently, depending on the predicate value), or exclude it from candidates to be drawn. Unfortunately, this shader unexpectedly cannot create new geometry and new triangles at its output, but it's followed by another new stage — Stream Out.