В AS3, как обновить часть растрового изображения с помощью Pixelbender вместо всего растрового изображения? - PullRequest
0 голосов
/ 17 февраля 2012

В чистом AS3 у меня есть pixelbender и большой точечный рисунок. Пиксель можно настроить с помощью параметра расстояния, который влияет только на небольшую область растрового изображения. Проблема в том, что pixelbender выполняется по всему растровому изображению. Каков наилучший способ обновить только обработанную область растрового изображения?

С учетом этой конфигурации:

shader.data.image.input = referenceBitmap.bitmapData; // 300x200
shader.data.position = [150,100];
shader.data.distance = [20];

Не работает следующее:

new ShaderJob(shader, 
              bitmap.bitmapData.getPixels(
                  new Rectangle(particle.x -10, 
                            particle.y -10,
                            20,
                            20))).start();

Я мог бы создать временный массив для хранения вычисленных значений, а затем скопировать их обратно в массив bitmapData. Хотя я бы хотел, чтобы шейдер обновлял пиксели bitmapData напрямую и только в уязвимой области.

Следующее работает, но шейдер работает на всем растровом изображении 300x200:

new ShaderJob(shader, bitmap.bitmapData).start();

Есть предложения?

РЕДАКТИРОВАТЬ: фильтр не будет работать, поскольку есть 3 входных изображения

1 Ответ

0 голосов
/ 17 февраля 2012

BitmapData позволяет вам использовать функцию с именем applyfilter .

Вместо того чтобы пытаться использовать растровые данные с shaderJob, вы можете поочередно использовать шейдер в качестве shaderFilter и применять shaderfilter к растровым данным.

shader = new Shader(fr.data);
shaderFilter = new ShaderFilter();
shaderFilter.shader = shader;

Когда у вас есть shaderFilter, вы можете использовать applyFilter для ваших bitmapData.Что-то вроде:

referenceBitmap.bitmapData.applyFilter(bitmap.bitmapData,new Rectangle(particle.x -10, 
                        particle.y -10,
                        20,
                        20),new Point(0,0),shaderFilter);

Надеюсь, это поможет.

...