Post image

AGAL регистры

toppick

AGAL (Adobe Graphics Assembly Language) - является языком ассемблером низкого уровня и описывает то что будет выполнять GPU. Используется для написания вершинных (vertex) и фрагментных (fragment) шейдеров, которые будут просчитаны графическим процессором во время отрисовки графики.

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

Если говорить по простому, шейдерный регистр это то откуда шейдер берет информацию и куда её записывает. Каждый регистр для шейдера кроме fs является четырехмерным вектором - набором из четырёх цифр с плавающей запятой: va.x, va.y, va.z, va.w.

AGLA дает возможность написания двух видов шейдерных программ:

  • вершинный шейдер - используется для преобразования вершин треугольников, генерации текстурных координат, расчета освещения и т. д.
  • фрагментный шейдер. - работает с фрагментами растрового изображения, используется на последней стадии графического конвейера для формирования изображения.

Оба вида программ имеют свой набор регистров и один общей v для передачи значений между ними. Каждая шейдерная программа обязана предоставить результат вычисления записав их в свой регистр вывода. Для вершинных шейдеров - op. Для фрагментных шейдеров - oc.

Вершинный шейдер (Vertext shader)

  • va - Вершинные атрибуты, максимальное количество 8. Служат для передачи параметров извне в вершинный шейдер и задаются методом Context3D.setVertextAt. Могут быть формата FLOAT_1, FLOAT_2, FLOAT_3, FLOAT_4 и BYTES_4
  • vc - Вершинные константы, максимальное количество 128. Служат для создание констант и задаются методом Context3D.setProgramConstants [FromByteArray, FromMatrix, FromVector]
  • vt - Временный вершинный регистр, максимальное количество 8. Служат для сохранения временных результатов. Фактически это переменная для AGAL
  • v - Интерполятор. Служит для передачи значения между вершинным и фрагментным шейдером. Значение этих регистров будут линейно интерполированы по всей площади полигона во время растеризации.
  • op - Вывод позиции, может быть только 1. Все предварительные расчеты записываются в этот регистр.

Пример

add vt0 vc0 va0 //складывает первый атрибут с первой константой и записываем результат во временный регистр
mov v0 va1 //записываем значение второго атрибута в интерполятор чтобы передать его в фрагментный шейдер
mov op vt0 // записываем временный вектор в вывод

Фрагментный шейдер (Fragment shader)

  • fs - Фрагментный сеплер текстур, максимальное количество 8. Служат для передачи текстур извне в фрагментый шейдер и задаются методом Context3D.setTextureAt. Использутеся исключительно в операторе tex.
  • fc - Фрагментные константы, максимальное количество 28 Служита для создание констант и задаются методом Context3D.setProgramConstants [FromByteArray, FromMatrix, FromVector]
  • ft - Временный фрагментый регистр, максимальное количество 8. Служат для сохранения временных результатов.
  • v - Интерполятор. Служит для передачи значения между вершинным и фрагментным шейдером. Значение этих регистров будут линейно интерполированы по всей площади полигона во время растеризации.
  • oc - Вывод конечного цвета пикселя, может быть только 1.

Пример

tex ft0, v0, fs0 <2d,linear,nomip> //выборка значения из текстуры с применение интерполятора из предыдущего примера и запись его во временный регистр
mov oc, ft0 //запись конечного цвета в вывод

Графическая подсказка

helper

Вот еще полезная статья по написанию шейдеров на AGAL: http://habrahabr.ru/post/130454/