Как работает графический конвейер и интерполяция?

Я только начал изучать программирование графики. Пользуюсь c++ и opengl. Когда я написал свой первый треугольник я думал, что хотя бы примерно понимаю как работает графический конвейер:

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

#version 330 core
layout (location = 0) in vec3 aPos;
 
void main()
{
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

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

#version 330 core
out vec4 FragColor;
 
void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
} 

Вершиный шейдер берет данные из нашего VBO и срабатывает столько раз, сколько у нас есть вершин. Фрагментный шейдер срабатывает 1 раз, чтобы задать цвет треугольника. Между ними есть этап растеризации, который "строит" треугольник. Потом я дошёл до этапа рисование треугольника в градиенте:

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

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
  
out vec3 ourColor; 
 
void main()
{
    gl_Position = vec4(aPos, 1.0);
    ourColor = aColor; 
}       

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

#version 330 core
out vec4 FragColor;  
in vec3 ourColor;
  
void main()
{
    FragColor = vec4(ourColor, 1.0);
}

И здесь я окончательно запутался. Сначала я подумал, что фрагментный шейдер срабатывает три раза, потом погуглив я нашёл информацию, что он срабатывает не 1 и не 3 раза, а столько, сколько пикселей в нашем треугольнике (то есть для каждого пикселя. Поправьте, если я не прав). Но я до сих пор не понимаю, как на выходе мы получаем треугольник в цвете градиент, если в FragColor мы передаём значения лишь для трёх цветов.

Знаю, что есть такое понятие как интерполяция. Нашёл информацию, что это какая-то переменная,которая тесно связана с этапом растеризации, но не больше.

В общем не могли бы вы мне рассказать в подробностях как именно работает графический конвейер, что такое интерполяция, и как и на каком этапе она происходит.


Ответы (0 шт):