Создание текстур с помощью функций шумов

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Для изменения вида растрового изображения можно применить к нему шумовой эффект с помощью метода noise() или perlinNoise() . Эффект шума можно сравнить с помехами, которые появляются на экране ненастроенного телевизора.

Для применения эффекта шума к растровому изображению используйте метод noise() . Этот метод применяет случайное значение цвета к пикселам внутри заданной области изображения.

Метод принимает пять перечисленных ниже параметров.

  • randomSeed (int): величина случайного начального числа, определяющая узор. Несмотря на свое название, если параметр передает одно и то же число, результат тоже получается один и тот же. Для получения случайного результата используйте метод Math.random() . Он передаст для этого параметра случайное число.

  • low (uint): этот параметр задает минимальное значение, генерируемое для каждого пиксела (от 0 до 255). Значение по умолчанию равно 0. Установка меньшего значения приводит к более темному рисунку шума, а большего — к более светлому.

  • high (uint): этот параметр задает максимальное значение, генерируемое для каждого пиксела (от 0 до 255). Значение по умолчанию равно 255. Установка меньшего значения приводит к более темному рисунку шума, а большего — к более светлому.

  • channelOptions (uint): этот параметр указывает, к какому каналу изображения применять эффект шума. Это число может сочетать любые из четырех значений каналов ARGB. Значение по умолчанию равно 7.

  • grayScale (Boolean): при значении true этот параметр применяет значение randomSeed к пикселам растрового изображения и убирает цвет из изображения. Этот параметр не влияет на альфа-канал. Значение по умолчанию равно false .

В примере ниже показано, как создавать растровое изображение и применить к нему синий шум.

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
 
    public class BitmapNoise1 extends Sprite 
    { 
        public function BitmapNoise1() 
        { 
            var myBitmap:BitmapData = new BitmapData(250, 250,false, 0xff000000); 
            myBitmap.noise(500, 0, 255, BitmapDataChannel.BLUE,false); 
            var image:Bitmap = new Bitmap(myBitmap); 
            addChild(image); 
        } 
    } 
}

Если вы хотите создать более естественную текстуру, используйте метод perlinNoise() . Метод perlinNoise() позволяет создавать реалистичные текстуры, идеально подходящие для имитации облаков, дыма, воды, огня и даже взрывов.

Так как метод perlinNoise() генерируется алгоритмом, ему требуется меньше памяти, чем текстурам на основе растровых изображений. Тем не менее, он может снижать быстродействие процессора и замедлять обработку содержимого, в результате чего экран будет перерисовываться медленнее, особенно на старых компьютерах. Это происходит из-за вычислений с плавающей точкой, которые нужны для обработки алгоритмов шума Перлина.

Этот метод принимает девять параметров (первые шесть обязательны).

  • baseX (Number): определяет значение x (размер) создаваемого узора.

  • baseY (Number): определяет значение y (размер) создаваемого узора.

  • numOctaves (uint): количество октав или индивидуальных функций шума, которые необходимо объединить с целью создания шума. При большем количестве октав создаются более детализированные изображения, но и времени на обработку требуется больше.

  • randomSeed (int): значение случайного начального числа действует так же, как и в случае функции noise() . Для получения случайного результата используйте метод Math.random() . Он передаст для этого параметра случайное число.

  • stitch (Boolean): при значении true этот метод будет стараться сгладить края перехода изображения для создания ровных текстур, которые можно использовать для мозаичной заливки растровым изображением.

  • fractalNoise (Boolean): этот параметр отвечает за края градиентов, генерируемых методом. При значении true он создает фрактальный шум, смягчающий границы области эффекта. При значении false он создает турбулентность. Изображение с турбулентностью имеет видимые прерывания градиента, благодаря чему оно больше подходит для более резких визуальных эффектов, например для создания языков пламени или морских волн.

  • channelOptions (uint): параметр channelOptions действует так же, как и в случае метода noise() . Он указывает, к какому цветовому каналу (растрового изображения) применяется узор шума. Это число может сочетать любые из четырех значений каналов ARGB. Значение по умолчанию равно 7.

  • grayScale (Boolean): параметр grayScale действует так же, как и в случае метода noise() . При значении true этот параметр применяет значение randomSeed к пикселам растрового изображения и убирает цвет из изображения. Значение по умолчанию равно false .

  • offsets (Array): массив точек, соответствующих смещениям в направлениях x и y для каждой октавы. Изменяя значения смещения, можно плавно прокручивать слои изображения. Каждая точка в массиве смещения применяется к функции шума конкретной октавы. Значение по умолчанию — null.

В следующем примере создается объект BitmapData размером 150 х 150 пикселов, для создания эффекта зеленых и синих облаков на котором вызывается метод perlinNoise() .

package 
{ 
    import flash.display.Sprite; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.BitmapDataChannel; 
 
    public class BitmapNoise2 extends Sprite 
    { 
        public function BitmapNoise2() 
        { 
            var myBitmapDataObject:BitmapData = 
                new BitmapData(150, 150, false, 0x00FF0000); 
             
            var seed:Number = Math.floor(Math.random() * 100); 
            var channels:uint = BitmapDataChannel.GREEN | BitmapDataChannel.BLUE  
            myBitmapDataObject.perlinNoise(100, 80, 6, seed, false, true, channels, false, null); 
             
            var myBitmap:Bitmap = new Bitmap(myBitmapDataObject); 
            addChild(myBitmap); 
        } 
    } 
}