Понадобятся нам и координаты источника освещения. Конечно, можно использовать обычные переменные OpenGL, но, чтобы продемонстрировать использование uniform-переменных, определим координаты источника освещения как такую переменную1:

uniform vec3 LightPosition;

Необходимо также определить количество света, рассеиваемого поверхностью, и количество отражаемого света. Можно было бы определить uniform-переменные, чтобы задавать эти величины из приложения, но здесь они определяются как константы, просто чтобы продемонстрировать дополнительные возможности языка:

const float SpecularContribution =0.3:
const float DiffuseContribution = 1.0 - SpecularContribution;

И наконец, нужно определить значения для передачи фрагментному шейдеру. Каждый вершинный шейдер должен вычислить однородные координаты вершины и сохранить их во встроенной переменной gl Position, и в данном шейдере тоже нужно это сделать. Шаблон кирпичей будет вычисляться во фрагментном шейдере «на лету*- как результат вычисления иекоей функции с аргументами х ъу - геометрическими значениями координат в модельной системе, специально для этого объявлена varying-переменная MCposition. Чтобы применить эффект освещения к верхней части кирпича, некоторая часть вычислений для освещения будет выполняться во фрагментном шейдере. Но большая часть этих вычислений

1 В тендерах, рассматриваемых в этой книге, принято писать имела, определенные разработчиком uniform-, varying- и attribute-! временных с большой буквы, чтобы отличать их от локальных или обычных глобальных переменных.

Глава б. Пример простого шейдера все же будет сделана в вершинном шейдере, который будет возвращать вычисленную силу света фрагментному шейдеру в varying-переменной Lightlntenslty. Вот как определяются эти две varying-переменные:

varying float tightIntensity: varying vec2 MCposition;

Теперь все готово для написания вершинного шейдера. Начнем с объявления точки входа для вершинного шейдера и вычисления координат вершины в пространстве обзора:

void main(void)
{
vec3 ecPosition = vec3 (gl_ModelViewMatrix * gl_Vertex);

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