void main (void) {
vec4 noisevec = texture3D(Noise. MCposition):
float intensity = ( noisevec[0] + noisevec[l] +
noisevec[2] + noisevec[3] + 0.03125) * 1.5:
vec3 color = rmx( SkyColor. CloudColor. intensity) * Lightlntensity: gl_FragColor = vec4 (color. 1.0):
}

12.5. Завихрения Интересные эффекты получаются при использовании абсолютного значения функции шума. Производная функции в этом случае будет разрывной, так как функция имеет излом в точке 0 (см. рис. 5.2). Если выполнить такую операцию над функциями шума на разных частотах и сложить результаты, результат функции будет иметь перегибы и изломы. Перлин называет этот вид шума завихрение (турбулентность), так как он напоминает турбулентный поток. В природе такие потоки встречаются довольно часто, и с помощью завихрения можно ими12.5. Завихрения тировать, например, огонь или лаву. Двухмерный вариант такого шума показан на рис. 12.7.

Абсолютное значение шума, или турбулентность

Рис. 12.7. Абсолютное значение шума, или турбулентность

2.5.1. Шейдер поверхности солнца Описываемый далее эффект похож на впадины в расплавленной лаве или на поверхности солнца, и его можно получить с помощью все того же вершинного шей-дера и немного измененного фрагментного шейдера. Основное его отличие в том, что каждое из значений шума масштабируется и сдвигается симметрично относительно 0, а потом вычисляется абсолютное значение. После сложения всех значений результат опять масштабируется, чтобы приблизительно помещаться в диапазон [0, 1]. В дальнейшем это значение используется для смешивания желтого и красного цветов, а результат такого смешивания показан на цветном рис. 20 (листинг 12.5). (В главе 13 будут рассмотрены некоторые способы анимации таких текстур, для того чтобы поверхность выглядела более интересно и реалистично.)

Листинг 12.5. Фрагментный шейдер поверхности солнца

varying float Lightlntensity; varying vec3 MCposition"opengl2_292.html">⇐ Предыдущая| |Следующая ⇒