Входные значения для этого вершинного шейдера передаются в двух varying-ne-менных, а вычисляются в вершинном шейдере, описанном ранее: Lightlntensity MCposition. Эти значения вычисляются для каждой вершины вершинным шейде-м и затем интерполируются по целому примитиву соответствующим аппаратным
Шум
модулем. В данном фрагментном шейдере можно обращаться к интерполированному значению каждой из этих переменных для каждого фрагмента.
Первая строка кода шейдера выполняет поиск по трехмерной текстуре шума и получает результат, состоящий из четырех компонентов. Значение i intensity вычисляется сложением четырех компонентов текстуры шума. Результат затем умножается на коэффициент масштабирования 1,5 и используется для плавного линейного перехода от белого цвета к небесно-голубому. Четыре канала текстуры шума имеют определенные значения: 0,25, 0,125, 0,0625 и 0,03125. Дополнительное значение 0,03125 добавляется к каждому среднему значению всех октав с более высокой частотой. Можно считать это «обесцвечиванием» средних значений на всех октавах с более высокой частотой, которые не включаются в вычисления (см. раздел 12.1). Умножение на коэффициент масштабирования 1,5 дает возможность «растянуть» полученное значение, чтобы выйти за рамки диапазона [0,1].
Затем на вычисленный цвет накладывается значение Lightlntensity, чтобы сымитировать диффузно отражающую поверхность, освещенную одним источником. Каждый компонент цвета затем приводится к диапазону [0, 1], результат заносится во встроенную переменную gl_FragColor со значением прозрачности 1,0 и передается для окончательной обработки. Объект, рендеринг которого выполнен данным шейдером, показан на цветном рис. 20, причем текстура на чайничке очень напоминает окончательное изображение рис. 12.6.
Листинг 12.4. Фрагментный шейдер для создания эффекта облачного неба
varying float Lightlntensity: varying vec3 MCposition:
uniform sampler3D Noise:
uniform vec3 SkyColor: // (0.0. 0.0. 0.8)
uniform vec3 CloudColor: // (0.8. 0.8. 0.8)