Эффекты шейдера Flex: рендеринг одного объекта в другой - PullRequest
1 голос
/ 12 ноября 2010

Я хочу создать такой эффект: перетаскиваемый полупрозрачный объект (назовем его «пластиковая полоса») поверх окна с произвольными объектамиПластиковая полоска должна быть мутной, то есть она размывает содержимое под собой (не размывается сама).Какой лучший способ сделать это с помощью шейдера PixelBender на Flex?

1 Ответ

1 голос
/ 12 ноября 2010

На самом деле все оказалось просто.Чтобы обновить пластиковую полосу, я рисую содержимое окна в растровое изображение, а затем подаю его в шейдер, чтобы нарисовать полосу (здесь она называется blurred):

private function onBlurredUpdate():void {
    matrix.identity();
    matrix.translate(-blurred.x, -blurred.y);
    clipRect.width = blurred.width;
    clipRect.height = blurred.height;

    body.removeChild(blurred);
    bitmapData.draw(body, matrix, null, null, clipRect);
    body.addChild(blurred);

    shader.data.src.input = bitmapData;

    var graphics:Graphics = blurred.graphics;
    graphics.clear();
    graphics.lineStyle(2, 0xC0C0C0);
    graphics.beginShaderFill(shader);
    graphics.drawRoundRect(0, 0, blurred.width, blurred.height, 10, 10);
    graphics.endFill();
}

Шейдер - это простой блочный фильтр из образцов PixelBender.Если я пропущу удаление полосы из окна перед рисованием, это даст забавный эффект обратной связи - размытые пиксели продолжат размываться, как чернила.

...