// 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-переменной.


⇐ Предыдущая| |Следующая ⇒