¿Cómo pasa vértice shader información de color a fragment shader?

En un sencillo programa OpenGL de hello-world, que simplemente dibuja un triángulo estático en la ventana, cuando configuro el vértice 3 del triángulo en rojo, verde y azul, el triángulo se llena con un degradado.

Pero cuando uso sombreadores como este:

Vertex Shader:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}

donde los atributosaVertex yaColor proviene de un búfer de vértice, pasado a través de una llamada deglVertexAttribPointer.

Sombreador de fragmentos:

varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}

El triángulo todavía está lleno de gradiente, y aquí viene la pregunta:

Si el vértice-sombreador se calcula por vértice, entonces cada instancia devColor Debe asignarse con el color de un vértice. Y el color del vértice debe ser rojo, verde o azul, como se establece en el búfer del vértice.

Entonces, ¿de dónde viene el gradiente?

O, en otra palabra, ¿cuándo sucedió que en el frag-shader, elvColor ¿Resulta ser el color interpolado en lugar del vértice?

Respuestas a la pregunta(2)

Su respuesta a la pregunta