Чтобы использовать шейдер Pixel Bender в ActionScript, сначала нужно получить к нему доступ через код ActionScript. Так как шейдер создается с помощью Adobe Pixel Bender Toolkit на языке Pixel Bender, код ActionScript не может обратиться к нему напрямую. Сначала нужно создать экземпляр класса Shader, который представляет шейдер Pixel Bender для ActionScript. Объект Shader позволяет получать информацию о шейдере, например, требует он параметров или значений ввода изображения. Объект Shader передается другим объектам, к которым требуется применить шейдер. Например, чтобы использовать шейдер в качестве фильтра, объект Shader нужно назначить свойству
shader
объекта ShaderFilter. А чтобы использовать шейдер в качестве заливки, объект Shader нужно передать в качестве аргумента методу
Graphics.beginShaderFill()
.
Код ActionScript может получить шейдер, созданное в Adobe Pixel Bender Toolkit (файл .pbj) двумя способами.
-
Загрузка во время выполнения: файл шейдера: можно загрузить как внешний ресурс с помощью объекта URLLoader. Этот прием напоминает загрузку внешнего ресурса, например текстового файла. В следующем примере демонстрируется загрузка файла байт-кода шейдера в среду выполнения и его привязка к экземпляру Shader.
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, onLoadComplete);
loader.load(new URLRequest("myShader.pbj"));
var shader:Shader;
function onLoadComplete(event:Event):void {
// Create a new shader and set the loaded data as its bytecode
shader = new Shader();
shader.byteCode = loader.data;
// You can also pass the bytecode to the Shader() constructor like this:
// shader = new Shader(loader.data);
// do something with the shader
}
-
Встраивание в SWF-файл: шейдер можно встроить в SWF-файл во время компиляции с помощью тега метаданных
[Embed]
. Тег метаданных
[Embed]
доступен только в том случае, если при компиляции SWF-файла используется Flex SDK. В теге
[Embed]
параметр
source
указывает на файл шейдера, а параметр
mimeType
является
"application/octet-stream"
, как в следующем примере.
[Embed(source="myShader.pbj", mimeType="application/octet-stream")]
var MyShaderClass:Class;
// ...
// create a shader and set the embedded shader as its bytecode
var shader:Shader = new Shader();
shader.byteCode = new MyShaderClass();
// You can also pass the bytecode to the Shader() constructor like this:
// var shader:Shader = new Shader(new MyShaderClass());
// do something with the shader
В любом из двух случаев происходит привязка байт-кода необработанного шейдера (свойства
URLLoader.data
или экземпляра класса данных
[Embed]
) к экземпляру Shader. Как показано в предыдущих примерах, байт-код можно присвоить экземпляру Shader двумя способами. Можно передать байт-код шейдера в качестве аргумента конструктору
Shader()
. Либо можно задать его в качестве свойства
byteCode
экземпляра Shader.
После того как шейдер Pixel Bender создано и связано с объектом Shader, его можно использовать для создания разных эффектов. Затенение можно использовать в качестве фильтра, режима наложения, растровой заливки, а также для автономной обработки растрового изображения и других данных. Также можно использовать свойство
data
объекта Shader, чтобы получить метаданные шейдера, задать вводимые изображения и значения параметров.