inorout += dot(distance, vec4(1.0)): Так как i norout инициализирована числом -3, добавим результат dot к предыдущему значению inorout. Эта переменная теперь содержит значение, лежащее в диапазоне [-3, 1], и нужно вычислить расстояние по отношению к еще одному полупространству. Функция smoothstep используется для выполнения такой же операции, как и с предыдущими полупространствами. Счетчик inorout обновляется: к нему добавляется результат вычисления отношения расстояния к пятому полупространству. Вычисленное расстояние до пятого полупространства показано на рис. 11.1, Э:
distance.х = dot(p. HelfSpace4);
distance.у = StripeWidth - abstp.z);
distance = srocthstep(-FWidth. FWidth. distance);
inorout += distance.x;
(В нашем случае операция smoothstep выполняется над vec4, но по-настоящему нужны только два компонента. Производительность будет лучше на графических устройствах, которые спроектированы так, чтобы обрабатывать значения vec4 параллельно, но это может быть несколько неэффективно на графических устройствах с.обычной архитектурой. В последнем случае компилятор языка шейдеров OpenGL может быть достаточно умным для того, чтобы понять, что результаты расчета третьего и четвертого компонентов никогда не будут использоваться в программе, и оптимизировать команды так, чтобы вычислялись только два значения.)
Значение i rorout находится в диапазоне [-3, 2]. Этот промежуточный результат показан на рис. 11.2, а. Приведением значения inorout к диапазону [0,1] получаем результат, показанный на рис. 11.2, б:
inorout = clamp(inorout, 0.0, 1.0); На этом этапе можно вычислять цвет поверхности фрагмента. Мы используем вычисленное значение i norout для достижения плавного перехода между желтым и красным цветами, чтобы определить звезду. Если остановиться здесь, результат будет таков, как на цветном рис. 16, а. Если лее выполнить плавный переход к цвету полосы, результат будет таким, как на цветном рис. 16, б. Так как использовалась функция smoothstep, значения inorout и distance.у позволят получить хорошо сглаженный край между цветамиsurfColor = mix(Yellow. Red, inorout): surfColor = mix(surfColor, Blue, distance.y):
Рис. 11.2. Промежуточные результаты вычислений: а- белым цветом обозначены точки на поверхности, находящиеся внутри по отношению ко всем пяти полуплоскостям, а серым - внутри по отношению только к четырем полуплоскостям; 6- значение inorout приведено к диапазону [0, 1] (АЛ Research, Inc.)
На этом этапе результат получается плоский и нереалистичный, и чтобы улучшить его, нужно рассчитать параметры освещения. Первый шаг - аналитически вычислить нормаль для данного фрагмента, что мы можем сделать, поскольку известны координаты центра шара в пространстве координат обзора (их можно получить из varying-переменной ECba 11 Center) и известны координаты фрагмента в пространстве координат обзора (из ECposition). (Этот подход можно использовать также в шейдере земного шара, создаваемого в разделе 10.2, чтобы не передавать нормаль поверхности и использовать интерполированные результаты.) На самом деле мы уже вычислили это значение и сохранили в р;