Как вершинный шейдер передает информацию о цвете фрагментному шейдеру?

В простой привет-программе OpenGL, которая просто рисует статический треугольник в окне, когда я устанавливаю 3 вершины треугольника в красный, зеленый и синий цвета, треугольник заполняется градиентом.

Но когда я использую шейдеры, как это:

Вершинный шейдер:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

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

где атрибутыaVertex а такжеaColor приходит из буфера вершин, переданного через вызов.glVertexAttribPointer

Фрагмент шейдера:

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

Треугольник все еще заполнен градиентом, и здесь возникает вопрос:

Если вершинный шейдер рассчитывается для каждой вершины, то каждый экземплярvColor должен быть назначен с цветом вершины. И цвет вершины должен быть красным, зеленым или синим, как установлено в буфере вершин.

Так откуда взялся градиент?

Или, другими словами, когда это случилось, что в фраг-шейдереvColor оказывается интерполированным цветом вместо вершиныs?

Ответы на вопрос(2)

Ваш ответ на вопрос