248 Глава 11. Процедурные текстурные шейдеры
тангенсами, второй - с несогласованными. Серые стрелки указывают направление тангенциального вектора и вектора бинормали (нормаль поверхности направлена прямо вверх перпендикулярно странице). Белые стрелки показывают направление навстречу источнику освещения (в данном случае это направленный источник освещения).
1. Пространство у поверхности вершины 1 2, Пространство у поверхности вершины 1
1. Пространство у поверхности вершины 2 2. Пространство у поверхности вершины 2
Рис. 11.4. Несогласованные тангенсы могут вызвать серьезные ошибки при вычислении освещения
1-1,4. Бугристая поверхность
В обоих случаях при преобразовании вершины 1 в локальное пространство координат поверхности получается один и тот же результат. Но при преобразовании вершины 2 наблюдается большое отличие, так как тангенциальные векторы этих двух вершин очень разные. Если бы они были определены согласованно, этого бы ие случилось, разве что поверхность стала бы очень изогнутой, И если это действительно так, можно разбить поверхность объекта на ячейки, чтобы предотвратить возможные проблемы.
В первом случае вектор направления освещения будет ровно интерполирован от первой до второй вершины, и все интерполированные векторы будут приблизительно одной длины. Если нормализовать этот вектор освещения в каждой вершине, его длина будет очень близка к единичной.
Но во втором случае векторы после интерполяции будут иметь разную длину, некоторые из них почти нулевые. Это может привести к дефектам изображения.
OpenGL не определяет конкретный вершинный атрибут для тангенциального вектора. Следует использовать произвольный атрибут вершины для передачи этого значения, также, как это сделано в примере, приведенном в разделе 10.5.1. Единственное различие в том, что не приложение будет передавать бинормаль, а вершинный шейдер сам будет вычислять ее.
Вершинный шейдер для метода бугристой поверхности приведен в листинге 11.7. Этот шейдер должен вычислять направления освещения и обзора в локальном пространстве координат поверхности. Входные данные для шейдера - координаты вершины, нормаль поверхности, тангенциальный вектор, Шейдер вычисляет бинормаль и преобразует координаты с помощью созданной матрицы преобразования. Текстурные координаты тоже передаются в вершинный шейдер, так как текстура используется для задания координат процедурных бугорков.