Molehill шейдеры

Данный пост является пояснением-продолжением “Создание собственных материалов и шейдеров в Alternativa3D 8”

Синтаксис
В AGAL синтаксис такой:
[opcode][destination][source1][source2 or sampler]
Порусишу:
[функция][результирующая переменная][обрабатываемая переменная 1][обрабатываемая переменная 2 или sampler(для текстуры)]

Официальная дока с пререлиз группы по шейдерам. В ней описаны все стандартные операнды и их все возможные свойства.
Необходимо отметить, что операнды также можно применять по-компонентно, для примера сохранение в x темповой переменной значения z переданной константы:

"add vt1.x, vc0.z\n"

Пример умножения компонент темповой переменной vt1 на z переданной константы,

"mul vt1, vt1, vc0.z\n"

А можно записать и в таком виде:

"mul vt1, vt1, vc0.zzzz\n"

В вершинном шейдере выходной переменной является op(output position) в фрагментном oc(ouput color)

va – содержит атрибуты вершин, в вершинных буферах, задается используя Context3D::setVertexBufferAt
vc – константы на один дроукол, задается методом Context3D::setProgramConstants
vt – временная переменная для вычислений
op – Output переменная вершинного шейдера положения в пространстве
oc – Output переменная фрагментного шейдера цвета, тут xyzw являются rgbw (w – alpha)
v – варьирующие переменные, передается из вершинного в фрагментный шейдер, для передачи данных
fs – для чтения передаваемой текстуры с помощью метода Context3D::setTextureAt

Словарь замен by iv

va -> vertexAttributes
vc -> vertexConstants
vt -> vertexTemp
op -> outputPosition
oc -> outputColor
v  -> variables
fs -> fragmentSampler

Список возможных переменных в вершинном шейдере:
va, v, op, vt, vc
Список возможных переменных в фрагментном шейдере:
v, oc, ft, fc
(атрибутов нету, т.к. все данные передаются через v)

Текстуры
Пример. Загрузка текстуры в темповую переменную ft0 фрагментного шейдера, по uv координатам из v0(переменная которая пришла из вершинного шейдера и атрибутов вершины), fs0 ссылка на текстуру которую мы загрузили в видеокарту с помощью метода Context3D::setTextureAt.

tex ft0, v0, fs0 <2D, repeat, linear, miplinear>

<2D, repeat, linear, miplinear> это типы сэмплинга текстуры, вот все варианты:
F = Filter (0=nearest,1=linear) (4bits)
M = Mipmap (0=disable,1=nearest,2=linear)
W = Wrapping (0=clamp,1=repeat)
S = Special flag bits (must be 0)
D = Dimension (0=2D,1=Cube)

Ограничения
1) Максимально кол-во вершин в одном буфере 65535.
2) 8 attribute registers. Вершинный буфер это по сути(очень грубо-говоря) один большой массив чисел, который содержит в себе данные о всех вершинах. Пример, для 3-ех вершин, где каждую характеризуют атрибуты pos и uv, вершинный буфер будет выглядеть так: x,y,z,u,v,x,y,z,u,v,x,y,z,u,v
Ограничение в том что каждую вершину можно описать максимально 8-ю атрибутами, причем размер атрибута может быть от 1 до 4. Т.е. по сути если я захочу, строку x,y,z,u,v,x,y,z,u,v,x,y,z,u,v – могу разбить на максимум 5 атрибутов для каждой вершины,
1 атрибут – x; //размер 1, Vector3D(x,null,null,null)
2 атрибут – y; //размер 1, Vector3D(y,null,null,null)
3 атрибут – z; //размер 1, Vector3D(z,null,null,null)
4 атрибут – u; //размер 1, Vector3D(u,null,null,null)
5 атрибут – v; //размер 1, Vector3D(v,null,null,null)

3) Высота и ширина текстуры должны быть степени двойки
т.е. допустимы 128×1024,128×128…
но не допустимы 300×512

Оптимизации
1. Простые операции сложения(матриц, простых значений) нужно стараться делать на процессоре
2. Уменьшение кол-ва дроуколов
3. Передавать как можно меньше вершин на отрисовку в видео-карту которые не попадают в экран

Всем начинающим рекомендую купить книгу Adobe Flash 11 Stage3D (Molehill) Game Programming Beginner’s Guide: RAW book and eBook

SergeyGonchar
flash-developer
Visit Gonchar Website.

6 Responses to “Molehill шейдеры”

  1. Kirill says:

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

  2. Igor says:

    Кочмар…21 век на дворе – еще бы в ассемблере написать код :(…. начало конца для флеша

  3. Maccimo says:

    @Igor: Жаль, что здешний движок не предусматривает возможности поставить вашему комментарию минус.

  4. Igor says:

    @Maccimo: я говорю, что юзабили скатывается к нулю. Отсутствует IDE. Вы ведь работаете с Flex (Flash Professional), а не пишите свой код в командах AVM2?
    http://www.adobe.com/content/dam/Adobe/en/devnet/actionscript/articles/avm2overview.pdf

  5. Maccimo says:

    @Igor: “Юзабилити скатывается к нулю”?

    То, что код приходится вставлять в виде строковых констант — да, не удобно. Автокомплишена опять же нет.

    Но это претензия к средам разработки. Можно попросить Потапенко с Дембицким — они добавят в свой RASE и всё будет хорошо.

    Или вас пугает страшное слово “ассемблер” т.к. вы никогда ни с каким из ассемблеров дела не имели?

    Не бойтесь, он совсем не страшный. По сути ни чем не отличается от вызовов пачки методов подряд, только синтаксис отличается.

    В Objective C синтаксис тоже от C/C++ отличается, но жалоб от разрабатывающих под iPhone на эту тему что-то не видно.

  6. Midnight says:

    >>В Objective C синтаксис тоже от C/C++ отличается, но жалоб от разрабатывающих под iPhone на эту тему что-то не видно.

    Жалуются, но их не так много и жалуются не так сильно.
    Просто там есть хорошая финансовая мотивация.

Leave a Reply

×
%d bloggers like this: