Уроки по програмированию в С+ OpenGL_GLSL часть пятая.
\-Базовые знания \- Шейдеры \-Урок5: Вершинный шейдер
Урок5: Вершинный шейдер
Цель работы вершинного шейдера - трансформация координат вершины а также передача и обработка необходимых данных о вершинах в текстурный шейдер, например, координата текстуры, нормаль. Полученные в вершинном шейдере значения затем интерполируются между вершинами и передаются во фрагментный шейдер.
Примечание1: вопреки распространенному мнению, операция интерполяции зачастую не является линейной, поэтому в ряде случаев приходится переносить многие вычисления в пиксельный шейдер. Это связано с тем, что система координат при наличии перспективы не является ортогональной, и в ней не выполняется линейность векторных операций.
Примечание2: вершинный шейдер обрабатывает вершины до отсечения их областью видимости, так что избежание обработки лишних вершин лежит целиком на программисте. Это сделано в связи с тем, что OpenGL заранее неизвестно, попадет ли вершина в область отсечения после трансформаций в вершинном шейдере.
gl_TexCoord [0...7] это заранее заданные varying (?) переменные, которые используются для передачи обработанных текстурных координат в пиксельный шейдер. Довольно часто не требуется трансформация текстурных координат(при текстурной матрицы, равной матрице идентичности), поэтому в таких случаях их стоит передавать без трансформации. Например, при отрисовке травы желательно избежать лишних операций.
gl_TexCoord [0] = gl_MultiTexCoord0;
Пример шейдера для просчета освещенности направленного источника:
uniform vec3 LightDir; //переданный шейдеру извне вектор направления источника света varying float Light; //эту переменную мы передаем на пиксельный шейдер
Теперь, объявив в пиксельном шейдере varying float Light; можно использовать интерполированное значение освещения (для направленного источника это значение будет точным).