□ Возможность задавать цвет кирпичей, промежутков между ними, расстояния между кирпичами по горизонтали и вертикали, соотношение горизонтального расстояния и длины кирпича, соотношение вертикального расстояния и высоты кирпича.
Геометрические параметры кирпичей (рис. 6.1) - некоторые размеры и их соотношения с другими параметрами - будут храниться в определенных разработчиком uniform-переменных типа vec2. Ширина кирпича по горизонтали, включая промежуток между кирпичами, будет обозначаться BrickSize.x. Высота кирпича, включая промежуток, будет обозначаться BrickSize.y. Эти две величины целесообразно сохранять в пространственных координатах объекта. Чтобы определить размеры (высоту и ширину) кирпича без промежутков, необходимо знать процентное соотношение общих размеров из Bri ckSi ze и размеров кирпича. Это соотношение хранится в Bri ckPet. х для горизонтальных размеров и в Bri ckPct .у для вертикальных размеров. Последние две величины должны входить в диапазон [0,1 ]. И наконец, цвет кирпича и промежутков представлен переменными BrickCol or nMortarColor.
Рис. 6.1. Параметры кирпича Теперь, когда определены желаемый результат и параметры, можно приступить к созданию вершинного и фрагментного шейдеров.
6.2. Вершинный шейдер
В вершинном шейдере должны выполняться операции над каждой вершиной. Чтобы создать вершинный шейдер для данного примера, нужно ответить на три вопроса.
1. Какие данные необходимо передавать вершинному щейдеру для каждой вершины (в attribute-переменных)?
2. Какие глобальные переменные состояния понадобятся вершинному шейдеру (uniform-переменные)?
3, Что явится результатом вычислений в вершинном шейдере (varying^nepeMenHbie)? Рассмотрим эти вопросы по отдельности.
Если не задать координаты каждой вершины, то вообще невозможно будет что-Лйбо нарисовать. Более того, освещение поверхности объекта не вычислить, если ке будут указаны нормали для каждой координаты, в которой нужно вычислять освещение. Так что минимальными входными параметрами будут координаты инормаль для каждой вершины. Эти параметры уже определены в OpenGL как встроенные переменные g1_Vertex и gl_Norma1. Если приложение будет использовать стандартные функции для задания координат и нормали, то никаких дополнительных attribute-переменных в вершинном шейдере объявлять не нужно, а чтобы получить эти значения в шейдере, следует просто обратиться к gl_Vertex и gl_Norrral.
Для реализации алгоритма рисования кирпичной стены понадобится доступ к некоторым параметрам состояния OpenGL. Например, таким параметром является те-1фщаяматрица модели-вида-проекции (gljfodel ViewProjectionMatri х) для преобразования координат вершин в пространство координат отсечения. Нужно получить доступ к текущей матрице модели-вида (gl _Model Vi ewMatri X) для преобразования координат вершин в пространство обзора при вычислении освещения. Также необходимо будет преобразовать нормали в пространство обзора, используя матрицу ■ЭДеобразования нормали (gl Normal Mat ri x, которая создается просто обратным тран-'■спонированием верхнего левого угла матрицы gl_Model Vi ewMatri х размером 3x3).