Adobe - Flash - Platform Вказує значення вводів та параметрів шейдера

Flash Player 10 і пізніших версій, Adobe AIR 1.5 та пізніших версій

Шейдер Pixel Bender у багатьох випадках за визначенням використовує одне або кілька зображень, що застосовуються для обробки шейдера. Наприклад, шейдер, як правило, приймає вихідне зображення та виводить його, застосувавши той чи інший ефект. Залежно від способу використання шейдера, значення, що вводиться, може задаватися автоматично або передаватися явно. Подібним чином шейдер часто визначає параметри, які використовуються для налаштування його виведення. Перед використанням шейдера необхідно також задати значення для всіх параметрів.

Щоб задати введення та параметри шейдера та визначити, чи очікує він вводів чи параметрів, потрібно використовувати властивість data об'єкта Shader. Властивість data є екземпляром класу ShaderData.

Визначення вводів та параметрів шейдера

Перш ніж задавати значення вводів і параметрів шейдера, необхідно з'ясувати, що очікує використовуваний шейдер: зображення або параметри, що вводиться. Кожен екземпляр Shader має властивість data, що містить об'єкт ShaderData. Якщо шейдер визначає введення або параметри, їх можна отримати як властивості цього об'єкта ShaderData. Імена властивостей збігаються з іменами вводів та параметрів у вихідному коді шейдера. Наприклад, якщо шейдер визначає введення з ім'ям src об'єкт ShaderData має властивість з ім'ям src, що представляє введення. Кожна властивість, що представляє введення, є екземпляром ShaderInput, а кожна властивість, що представляє параметр, - екземпляром ShaderParameter.

Однак, якщо такої документації немає (як і вихідного коду), дані шейдера можна проаналізувати, щоб визначити його введення та параметри. Властивості, що становлятьвводи та параметри, що додаються в об'єкт ShaderData динамічно. Отже, об'єкт ShaderData можна проаналізувати за допомогою циклу for. Як описано в розділі «Отримання метаданих шейдера», всі метадані, визначені для шейдера, також можна отримати як динамічну властивість, що додається до властивості Shader.data . Використовуючи цей прийом для визначення введення та параметрів шейдера, перевірте тип даних динамічних властивостей. Якщо властивість є екземпляром ShaderInput, воно є введенням. Якщо властивість є екземпляром ShaderParameter, вона представляє параметр. В інших випадках воно є значення метаданих. У наступному прикладі демонструється використання циклу for..in для аналізу динамічних властивостей, що містяться у властивості data шейдера. Кожне введення (об'єкт ShaderInput) додається до примірника Vector з ім'ям inputs . Кожен параметр (об'єкт ShaderParameter) додається до екземпляра Vector з ім'ям parameters . А властивості метаданих додаються в екземпляр Vector з ім'ям metadata. Зверніть увагу, що для цього прикладу необхідно створити екземпляр Shader з ім'ям myShader .

Вказівка ​​значень шейдера, що вводяться

У багатьох випадках шейдер очікує одне або кілька зображень, що вводяться, які використовуються в ході обробки шейдера. Однак під час використання об'єкта Shader введення часто вказується автоматично. Припустимо, що шейдер очікує одне введення і що він використовується як фільтр. Коли фільтр застосовується до екранного об'єкта або об'єкта BitmapData, цей об'єкт автоматично задається як введення. У такому випадку не потрібно явно задавати значення, що вводиться.

Однак у деяких випадках, особливо якщоШейдер визначає кілька вводів, значення для введення необхідно ставити явно. Кожне введення, визначене в шейдері, представлене в ActionScript об'єктом ShaderInput. Об'єкт ShaderInput є властивістю екземпляра ShaderData у властивості data об'єкта Shader, як описано в розділі "Визначення вводів та параметрів шейдера". Припустимо, що шейдер визначає введення з ім'ям src і що він пов'язаний з об'єктом Shader з ім'ям myShader. У цьому випадку об'єкт ShaderInput, що відповідає введенню src можна отримати з використанням наступного ідентифікатора:

Кожен об'єкт ShaderInput має властивість input, за допомогою якого задається значення для введення. Властивості input призначається екземпляр BitmapData, щоб задати графічні дані. Також властивості input можна призначати екземпляр BitmapData або Vector. для завдання бінарних чи числових даних. Щоб отримати додаткові відомості про використання екземпляра BitmapData або Vector.Екземпляр як введення, див. опис ShaderInput.input у довіднику ActionScript® 3.0 для платформи Adobe® Flash® Platform.

Крім властивості input об'єкт ShaderInput має властивості, за допомогою яких можна визначити, який тип зображення очікується як введення. До них належать властивості width, height і channels. Кожен об'єкт ShaderInput також має властивість index, за допомогою якого можна визначити, чи має значення введення передаватися явно. Якщо шейдер очікує більше вводів, ніж задається автоматично, значить, для введень, що залишилися, значення потрібно задавати явно. Щоб отримати додаткові відомості про різні способи застосування шейдера та про те, чи задаються значення автоматично, див. розділ Використання шейдера.

Вказівка ​​значень параметрів шейдера

У деяких випадках шейдер визначає значення параметрів, що використовуютьсястворення висновку. Наприклад, шейдер, що змінює яскравість зображення, може вказати параметр, що визначає міру впливу операції на яскравість. Один параметр, визначений у шейдері, може очікувати одне або кілька значень відповідно до свого визначення у вихідному коді. Кожен параметр, визначений у шейдері, представлений ActionScript об'єктом ShaderParameter. Об'єкт ShaderParameter є властивістю екземпляра ShaderData у властивості data об'єкта Shader, як описано в розділі Визначення вводів та параметрів шейдера. Припустимо, що шейдер визначає параметр з ім'ям brightness і що він пов'язаний з об'єктом Shader з ім'ям myShader. У цьому випадку об'єкт ShaderParameter, що відповідає введенню brightness, можна отримати з використанням наступного ідентифікатора:

Щоб задати одне або кілька значень параметра шейдера, створіть масив ActionScript з одним або декількома значеннями та призначте його властивості значення об'єкта ShaderParameter. Властивість value визначається як екземпляр Array, оскільки один параметр шейдера може вимагати кілька значень. Навіть якщо параметр шейдера очікує лише одне значення, його необхідно помістити в об'єкт Array, щоб призначити його властивості ShaderParameter.value. Наступний рядок задає одне значення як властивість value.

Якщо вихідний код Pixel Bender для шейдера визначає значення за замовчуванням для параметра, створюється масив, який містить одне або кілька значень за умовчанням і призначається властивості value об'єкта ShaderParameter, коли створюється об'єкт Shader. Після призначення масиву властивості значення значення параметра можна змінити, вказавши інше значення для елемента масиву (навіть якщо це масив за замовчуванням). Для цього не потрібно створювати новий масив та призначати його властивості value.

УВ наступному прикладі значення параметра шейдера задається в коді ActionScript. Шейдер визначає параметр з ім'ям color. Параметр color оголошується як змінна float4 у вихідному коді Pixel Bender, тобто це масив із чотирьох чисел із плаваючою комою. У цьому прикладі значення параметра color постійно змінюється і при кожній зміні на екрані за допомогою шейдера малюється кольоровий прямокутник. В результаті можна спостерігати анімовану зміну кольору.

Код ActionScript будується на основі трьох методів.

init() : у методі init() код завантажує файл байт-коду Pixel Bender, що містить шейдер. Після завантаження файлу викликається метод onLoadComplete().

onLoadComplete() : метод onLoadComplete() код створює об'єкт Shader з ім'ям shader . Він також створює екземпляр Sprite з ім'ям texture. У методі renderShader() код малює результат шейдера в об'єкті texture по одному разу в кожному кадрі.

onEnterFrame() : метод onEnterFrame() викликається один раз кожного кадру для створення ефекту анімації. У цьому методі код задає значення параметра шейдера новий колір, а потім викликає метод renderShader() , який малює на екрані виведення шейдера у вигляді прямокутника.

renderShader() : у методі renderShader() код викликає метод Graphics.beginShaderFill() , щоб вказати заливку шейдером. Потім він малює прямокутник, заливка якого визначається виведенням шейдера (згенерований колір). Для отримання додаткових відомостей про застосування шейдера див. розділ Використання шейдера як заливки.

Нижче наведено код ActionScript для цього прикладу. Використовуйте цей клас як основний клас програми для проекту, створеного лише на базі ActionScript у Flash Builder, або як клас документа для FLA-файлу в інструменті FlashProfessional.

Нижче наведено вихідний код для ядра шейдера ColorFilter, який використовувався для створення файлу байт-коду Pixel Bender з ім'ям «ColorFilter.pbj».

Якщо використовується шейдер, параметри якого не задокументовані, можна перевірити властивість type об'єкта ShaderParameter, щоб з'ясувати, скільки елементів якого типу повинні бути включені в масив. Властивість type вказує тип даних параметра відповідно до визначення шейдера. Список кількості та типу елементів, очікуваних параметрами кожного типу, див. у описі властивості ShaderParameter.value у довіднику ActionScript® 3.0 для Adobe® Flash® Professional CS5.