// attribute-переменные, обычно меняются для каждой вершины attribute float VertexTemp;
// varying-переменные передают значения // из вершинного шейдера фрагментному varying float Temperature:
void mainO {
1 Автор этой главы - Джон Кэссснич.
Определение языка
// вычисляется температура для интерполирования во фрагментах // в диапазоне [.0.0. 1.0]
Temperature = (VertexTemp - CoolestTemp) / TempRange; /*
Размещение вершины, установленное функцией glVertexO. можно прочесть из встроенной переменной gIVertex. Растеризатору для определения положения вершины нужно знать и это значение, и текущую матрицу модели-вида.
*/
gl_Positïon = gl ModelVlewProjectionMatrix * gl_Vertex:
}
Это код вершинного шейдера. Затем выполняется сборка примитивов, после которой растеризатор получает достаточно информации для создания фрагментов. Растеризатор интерполирует значения Temperature в вершинах и создает значения для фрагмента. После этого каждый фрагмент передается фрагментному шейдеру:
// uni form-переменные меняются не чаще, чем для каждого примитива // vec3 объявляет вектор из трех чисел с плавающей запятой1 uniform vec3 CoolestColor; uniform vec3 HottestColor:
// Temperature содержит интерполированное для фрагментов значение // температуры, установленное вершинным шейдером varying float Temperature:
void mainС) {
// получить цвет из промежутка между самым холодным и самым теплым
// с помощью астроенной функции mixO
vec3 color = mixCCoolestColor. HottestColor, Temperature):
// Создать вектор из 4 чисел с плавающей запятой, добавив значение
// прозрачности, равное 1.0, и установить фрагменту этот цвет
gl_FragColor = vec4(color. 1.0);
}
Оба шейдера получают данные от приложения через объявленные uniform-переменные. Вершинный шейдер получает информацию о каждой вершине через attribute-переменную. Из вершинного шейдера фрагментному шейдеру информация передается через varying-переменные, объявления которых должны совпадать в обоих шейдерах. Стандартная функциональность, расположенная между вершинным и фрагментным процессорами, интерполирует вершинные значения из varying-переменной. Фрагментный шейдер читает уже интерполированные значения из той же varying-переменной.