The *Vertex Shader* is responsible for transforming the coordinate space of a model into Clip Space.

It is also responsible for forwarding these coordinates, to the Tessellation, Geometry and Fragment shader.

### Vertex Shader Inputs

Inputs to vertex shaders can be *Attributes* and *Uniforms*. Both attributes and Uniforms are treated as **Read-Only** variables by the vertex shader.

Attributes variables, such as *positions, normals and uv-coordinates* for each vertex, are considered read-only to the vertex shader.

Uniform variables are constant across a graphics primitive and are read-only to **ALL** shaders. Thus, Uniform variables can be read by the Vertex Shader, Tessellation Shader, Geometry Shader and Fragment Shader but can't be directly modified.

### Vertex Shader Outputs

As mentioned above, the main resposibility of a vertex shader is to compute the coordinates of a model into Clip Space. This calculation is placed in a required variable called **gl_Position**. This variable holds the 4D vertex position in clip coordinates.

Usually, what is sent to a vertex shader from the CPU is not just the coordinates of a vertex, but also the normals of the vertex, color of the vertex, etc. These variables may be used in the Fragment Shader for lighting computations.