Далее сравниваем d с BumpSi ze, чтобы узнать, есть в данной точке бугорок или нет. Если нет, изменяющий вектор устанавливается в 0, а коэффициент нормализации - в 1,0. В следующих нескольких строках вычисляется освещение. Нормализованный изменяющий вектор умножается на коэффициент нормализации f. Рассеянное и зеркальное отражения вычисляются как обычно, за исключением того, что используются векторы освещения и обзора в локальном пространстве координат поверхности. Неплохие результаты получаются и без нормализации этих двух векторов, если значения их не будут сильно различаться от вершины к вершине.
11.4. Бугристая поверхность
Листинг 11.8. Фрагментный шейдер для процедурного метода бугристой поверхности
varying vec3 LightDi г; varying vec3 EyeDir:
uniform vec3 SurfaceColor: // = CO.7. 0.6. 0.18)
uniform float BumpDensity; // = 16,0
uniform float BumpSize; // = 0.15
uniform float SpecularFactor; // = 0.5
void main (void) {
ec3 litColor;
ec2 с = BumpDensity * glJexCoordCO],st; єс2 p - fractCc) vec2 (0.5);
loat d. f:
= p.x * p.x + p.у * p.у; = 1.0 / sqrtCd + 1.0);
f Cd >= BumpSize)
{ p = vec2CO.O); f = 1.0; }
vec3 normDelta - vec3 Cp.x, p.y, 1.0) * f;
litColor = SurfaceColor * max(dot(normDelta, LightDir), 0.0);
vec3 reflectDir = ref 1 ectCLightDiг. norrflDelta);
float spec = max(dot(EyeDir. reflectDir). 0.0);
spec = pow(spe.c. 6.0)
spec *=- SpecularFactor:
litColor = minClitColor + spec. vec3 (1.0)):
glFragColor = vec4 (litColor. 1.0);
}
Результаты применения такого шейдера к двум объектам, простому блоку и тору, показаны на цветном рис. 18. Текстурные координаты используются для определения расположения бугорков, и, так как текстурные координаты изменяются от 0,0 до 1,0 четыре раза по окружности тора, бугорки выглядят на этом объекте расположенными гораздо ближе друг к другу.
11.4.4. Карты нормали Рассматриваемый шейдер можно легко изменить, чтобы он получал значения для изменения нормали из текстуры, а не вычислял их самостоятельно. Текстура, которая содержит значения изменяемой нормали, называется карта нормали.