12.4. Простой шейдер шума
2.4.2. Вершинный шейдер
листинге 12.3 приведен код вершинного шейдера, который работает совместно четырьмя фрагментными шейдерами шума, описанными далее. Это простой ейдер, так как в нем должны проводиться всего три операции. 1 Как и во всех вершинных шейдерах, вершинные координаты должны быть преобразованы и записаны во встроенную varying-переменную glPosition.
Входные значения нормали и uniform-переменная LightPos участвуют в вычислении интенсивности освещения от простого белого источника. Для увеличения освещенности результат умножается на коэффициент 1,5.
Входные вершинные координаты сохраняются в varying-переменной MCposition, и эти значения становятся доступными фрагментному шейдеру как координаты каждого фрагмента объекта в модельном пространстве. Эти координаты - идеальное входное значение для поиска по текстуре. Не имеет значения, в каком положении нарисован объект; у фрагментов будут всегда одни и те же (или очень близкие) координаты, поэтому значения шума в каждой точке поверхности объекта всегда будут одинаковые (или с очень небольшой погрешностью). Uniform-переменная Sea 1 е устанавливается приложением, чтобы наиболее оптимально масштабировать объект по отношению к размеру текстуры шума.
истинг 12.3. Вершинный шейдер для рисования облаков
varying float Lightlntensity: varying vec3 MCposition;
uniform vec3 LightPos: uniform float Scale;
void main(void) {
vec3 ECposition = vec3 (gl_ModelViewMatrix * gl_Vertex):
MCposition = vec3 (gl_Vertex) * Scale:
vec3 tnorm = normalize(vec3 (gl_NormalMatrix * gl_Normal)):
Lightlntensity = dot(normalize(LightPos - ECposition). tnorm):
Lightlntensity *= 1.5:
gl_Position = ftransformO :
}
2.4.3. Фрагментный шейдер
осле вычисления текстуры шума и вызова функций OpenGL для загрузки тек-ры в графический акселератор можно применять описанный ранее вершин-ый шейдер совместно с очень простым фрагментным шейдером (листинг 12.4). результате обработки изображения получится эффект неба, покрытого облака-и. Можно немного поэкспериментировать с цветом, чтобы изображение стало лее реалистичным.