W jaki sposób moduł cieniujący wierzchołków przekazuje informacje o kolorze w celu fragmentacji modułu cieniującego?
W prostym hello-świecie OpenGL, który po prostu rysuje statyczny trójkąt na oknie, kiedy ustawiam 3 wierzchołki trójkąta na czerwony, zielony i niebieski kolor, trójkąt jest wypełniony gradientem.
Ale kiedy używam takich shaderów:
Vertex Shader:
attribute vec4 aVertex;
attribute vec4 aColor;
varying vec4 vColor;
void main(void) {
gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
vColor = aColor;
}
gdzie atrybutyaVertex
iaColor
pochodzi z bufora wierzchołków, przechodzącego przez wezwanieglVertexAttribPointer
.
Fragment Shader:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
Trójkąt jest nadal wypełniony gradientem i tutaj pojawia się pytanie:
Jeśli vertex-shader jest obliczany na wierzchołek, to każde wystąpienievColor
powinien mieć przypisany kolor wierzchołka. A kolor wierzchołka powinien być czerwony, zielony lub niebieski, zgodnie z ustawieniem w buforze wierzchołków.
Skąd więc pochodzi gradient?
Innymi słowy, kiedy to się stało, że w fragmencie shaderavColor
okazuje się być interpolowanym kolorem zamiast wierzchołka?