Как вершинный шейдер передает информацию о цвете фрагментному шейдеру?
В простой привет-программе 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?