Как непрерывно затухать BitmapData до определенного цвета? - PullRequest
0 голосов
/ 11 октября 2009

Я рисую материал на bitmapData, и мне нужно непрерывно постепенно уменьшать каждый пиксель до 0x808080, пока он рисует (это для DisplacementMapFilter) ... Я думаю, что это иллюстрирует мою проблему:
http://www.ventdaval.com/lab/grey.swf

Более простой подход, который я пробовал - рисовать на нем полупрозрачную серую рамку, но она никогда не достигает одного цвета (т. Е. 0x808081 никогда не превратится в 0x808080) ... То же самое происходит с ColorMatrixFilter, пытающимся постепенно уменьшайте насыщенность и / или контраст. (в приведенном выше примере применяется фильтр с контрастностью -10 в каждом кадре).

Я сейчас пытаюсь использовать paletteMap, и я чувствую, что это может быть путь, но я не смог получить его ... какие-либо идеи?

Ответы [ 3 ]

1 голос
/ 04 апреля 2010

Я думаю, что самый простой способ сделать это - использовать два последовательных цветовых фильтра. То есть:

var n:Number = 0.9;
var off:Number = 0x80;
var filter:ColorMatrixFilter = new ColorMatrixFilter( [
        1, 0, 0, 0, -off, 
        0, 1, 0, 0, -off, 
        0, 0, 1, 0, -off, 
        0, 0, 0, 1, -off ] );
var filter2:ColorMatrixFilter = new ColorMatrixFilter( [
        n, 0, 0, 0, off, 
        0, n, 0, 0, off, 
        0, 0, n, 0, off, 
        0, 0, 0, n, off ] );

function onFrame( e:Event ) {
    myBMD.applyFilter( myBMD, myBMD.rect, new Point(), filter );
    myBMD.applyFilter( myBMD, myBMD.rect, new Point(), filter2 );
}

Первый фильтр смещает значение каждого канала вниз на 128 - превращая ваше серое изображение в черное. Второй фильтр умножает значение каждого канала на модулятор (0,9 в моем примере), а затем смещает значения обратно на 128.

1 голос
/ 25 января 2013

Я решил эту проблему, заполнив текстуру 0xFF808080 в каждом кадре, затем нарисовал мои динамические данные во втором прозрачном растровом изображении, выполнил colort-преобразование на нем с более низким альфа-множителем (скажем, 0,98), а затем скопировал пиксель этого растрового изображения основной растр с включенной mergealpha. Работает угощение:

public function update():void 
        {
            lock(); 
            fillRect(rect, 0xFF808080);

            drawTarget.lock();
            drawTarget.colorTransform(rect, fadeTransform);
            drawTarget.applyFilter(drawTarget, rect, pt, blurFilter); 
            drawTarget.unlock();

            copyPixels(drawTarget, rect, pt, null, null, true);
            unlock();
        }
1 голос
/ 27 ноября 2009

Вы можете попытаться затемнить его немного больше, чем сейчас, поэтому цвет будет равен 0x808080, вам просто нужно сделать некоторые вычисления.

Да, вы можете сделать это с paletteMap. Третий способ - написать шейдер PixelBender для него. Вы также можете использовать свое обычное затухание и делать paletteMap или PixelBender один раз в несколько кадров, чтобы ускорить все это.

...