Вычисленное значение можно использовать для горизонтальных и вертикальных компонентов процедурного шаблона кирпичной стенки. Так как приложение знает ширину и высоту кирпичей (Bri ckPct. х и Bri ckPct. у), выражение 1.0 - Bri ckPct. х and 1.0- BrickPct .у легко вычислить и передать полученное значение во фрагментный

Сглаживание процедурных текстур

шейдер, что избавит от необходимости рассчитывать его для каждого фрагмента отдельно. Так как выражение будет вычисляться два раза с разными аргументами, удобно определить его как макрос или функцию:

fdefine Integral(х. p. notp) ((floor(x)*(p)) + max(fract(x)-(notp). 0.0)) Параметр p содержит значение части импульса (при значении функции 1,0), а параметр notp содержит значение, не являющееся частью импульса (при значении функции 0). С помощью этого макроса можно написать код для вычисления интегрального значения по всей ширине фильтра: vec2 fw. useBrick:

fw = fwidth(po5ition);
useBrick = (Integral(position + fw. BrickPct. MortarPct) -Integral(position. BrickPct. MortarPct)) / fw;

Результат делится на площадь фильтра (в данном случае имеется в виду прямоугольный блок), чтобы получить среднее значение функции в выбранном промежутке.

14.4.5. Фрагментный шейдер кирпичной стенки со сглаживанием Попробуем заставить описанную процедуру работать. Простая технология семп-линга, использованная в примере в главе 6, заменяется аналитической интеграцией. Окончательный шейдер приведен в листинге 14.2. Разница между результатами работы шейдера без сглаживания и шейдера со сглаживанием показана на цветном рис. 25.

Листинг 14.2. Исходный код фрагментного шейдера кирпичной стенки со сглаживанием

uniform vec3 BrickColor. MortarColor; uniform vec2 BrickSize; uniform vec2 BrickPct: uniform vec2 MortarPct;
varying vec2 MCposition; varying float Lightlntensity;
Idefine Integral (x. p, notp) ((floor(x)*(p)) + max(fract(x)-(notp). 0.0))
void main(void) {
vec2 position, fw. useBrick: vec3 color;

// Определение координат в шаблоне кирпичной стенки position = MCposition / BrickSize:


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