Первая строчка вершинного шейдера преобразует входные координаты с помощью проекционной матрицы модели-вида. Следующая строчка вычисляет направление освещения вычитанием координат вершины из координат источника освещения. Так как переменная LightPos - типа vec3, а встроенная переменная gl_Vertex - типа vec4, необходимо использовать компоненты . xyz, чтобы получить первые три элемента gl_Vertex перед вычитанием векторов. Результат вычитания векторов нормализуется и сохраняется как направление освещения.

Следующая строчка кода вычисляет половинный угол следующим образом: вектор обзора и вектор освещения складываются и результат нормализуется.

Следующие несколько строк кода выполняют двухмерную параметризацию половинного угла и вектора приращения. Это нужно для вычисления значений для и (Du) и v (Dv), которые подставляются в биквадратное уравнение во фрагментиом шейдере (так называемый метод ортонормирования Грама-Шмидта). Здесь Н (половинный угол), Т' и В' - ортогональные оси системы координат, Т' и В' поддерживают общее выравнивание с исходными векторами Т (тангенциальный вектор) и 6 (вектор бинормали). В то время как Т и В лежат на плоскости треугольника, рендеринг которого выполняется, Т' и В' находятся в плоскости, перпендикулярной вектору половинного угла. Обоснование для определения системы координат через Н, Г и В' содержится в документе «Interactive Rendering with Arbitrary BRDFs Using Separable Approximations* (авторы Ян Куц и Майкл МакКул, 1999 г.).

BRDF-данные часто содержат шум и помехи, если инцидентные углы очень большие (почти 180°), так что в следующей строчке кода эта проблема устраняется наложением коэффициента на половинный угол.

Затем код данного вершинного шейдера вычисляет значения для Ни и Hv и помещает их в varying-nepeMeimyio TexCoord. Эти коэффициенты будут подставлены в биквадратное уравнение во фрагментном шейдере как значения и и v. Этими значениями определяется параметризованный вектор приращения, который будет использоваться для поиска требуемых коэффициентов полинома из текстуры, так что значения приводятся к диапазону [0, 1].


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