Der Vertex Shader ist Teil der OpenGL Draw-Pipeline und wird für jeden Vertex aufgerufen. Üblicherweise wird hier berechnet:

  • Transformationen der Model-Verticies durch die verschiedenen Spaces

Ein Vertex Shader muss mindestens die Clip Space-Position des aktuellen Vertex in gl_Position zurück geben.

Arbeitsweise

  • Vom Input gl_VertexID kommt der Index des aktuellen Vertex
  • In den Output gl_Position kommt die Clip-Space Position des aktuellen Vertex
  • Andere Inputs mit können mit Input-Streams verbunden werden mit glBindAttribLocation

Interpolationsart einstellen

Alle Outputs werden an den Rasterisierer gegeben, der diese dann Interpoliert und an den Fragment Shader weitergibt.

Man kann die Art und Weise, wie interpoliert wird steuern, indem man vor out ein Keyword schreibt:

  • <Kein Keyword> - Interpoliert durch Baryzentrische Interpolation
  • flat - Kein Interpolieren, Wert kommt vom “provoking vertex” (meist erster Vertex des Dreiecks)
  • noperspective Interpolation durch Lineare Interpolation, ohne Perspektivkorrektur

Beispiel:

flat out vec3 frag_col; 

Beispiel

Dieser Vertex Shader transformiert einen Vertex vom Eyespace in den Clip Space und gibt die Farbe weiter an den Fragment Shader:

in vec3 local_vertex;
in vec3 color;
 
out vec3 frag_col;
 
uniform mat4 view;
uniform mat4 proj;
 
void main() {
	gl_Position = proj * view * vec4(local_vertex, 1.0);
	frag_col = color;
}