{

vec3 color;

vec2 position. useBrick: Вычисления, выполненные в этом шейдере, очень похожи на обычные вычисления на языке С, а все локальные переменные будут определены до их использования в начале функции mai п. В некоторых случаях это делает код более удобочитаемым и понятным, но в основном такие определения зависят от предпочтений разработчика. Первая строчка кода в примере будет вычислять значения для локальной переменной position типа vec2: position = MCposition / BrickSize; В этой строке происходит деление координаты х фрагмента в модельных координатах на ширину столбца, а координаты ]/ фрагмента - на ширину строки. Получаем «номер ряда» (position.у) и «номер кирпича» (position.х). Это знаковые значения, числа с плавающей запятой, так что можно получить отрицательные номера кирпичей и рядов. Определим, нужно ли рисовать данный ряд со смещением (каждый второй ряд смещается на полкирпича):

if (fract(position.y * 0.5) > 0.5) position.* += 0.5; «Номер ряда» (position .у) умножается на 0,5, и результат сравнивается с 0,5. Через ряд это значение будет получаться true, и «номер кирпича» (position.x) увеличивается на 0,5, чтобы сместить ряд с нечетным номером на половину кирпичика. Теперь нужно вычислить координаты фрагмента по отношению к текущему кирпичу:

position = fract(position): Это вычисление дает нам горизонтальную и вертикальную координаты отдельного кирпича, которые будут использоваться для определения того, следует ли использовать для закраски цвет кирпичей или цвет промежутка между ними.

Чтобы упростить выбор цвета, понадобится также функция, возвращающая 1,0 на самом кирпиче и 0 - на промежутке между кирпичами. Так как у функции рисования кирпичей есть и горизонтальный, и вертикальный компоненты, то функции выбора цвета будет две: для горизонтального и для вертикального компонентов. Для получения искомого цвета результаты выполнения обеих функций перемножаются. Если результат хотя бы одной функции 0 (цвет промежутка), то окончательный результат - 0; в противном случае результатом будет 1,0 (цвет кирпича).

Для получения такой функции можно использовать функцию step (edge. х). Онаполучает два аргумента: край (edge) и параметр для повторной проверки этого края. Если значение параметра меньше или равно значению границы, функция возвращает 0; в противном случае - 1,0 (см. рис. 5.11). Обычно функцию step используют для получения импульсов (прямоугольных колебаний), при этом функция начинается с 0 и поднимается до 1 при достижении некоего порога. Для данной задачи можно получить функцию, значения которой начинаются с 1,0 и затем падают до 0. Этого можно достичь перестановкой ее аргументов:

useBrick = stepCposition, BrickPct): Здесь вычисляются два значения, по которым можно узнать, находится ли данная точка на кирпиче или вне его, позиции прослеживаются в горизонтальном (useBri ck. х) и вертикальном (useBri ck. у) направлениях. Встроенная функция step будет возвращать 0 при условии Bri ck Pet. х <= posi ti on. x и 1,0 при условии Bri ckPct, x >position.x. Функция fract обеспечивает попадание значения position.x в диапазон [0, 1). Переменная Bri ckPct - типа uniform, так что ее значение будет постоянным в пределах одного примитива. Это определяет, что значение useBri ck. х будет равно 1,0 для кирпича и 0 - для промежутка между кирпичами (по горизонтали). Тоже самое выполняется для вертикального направления, position.у и BrickPct.y Используются для того, чтобы вычислить значение useBri ck. у. Умножив useBri ck. х на useBrick .у, получим 0 или 1,0, что позволит выбрать цвет фрагмента. Периодическая функция для горизонтального компонента шаблона кирпичной стены приведена на рис. 6.3.


⇐ вернуться назад | | далее ⇒