ПОМОЩЬ AGAL: в 2D-текстуре, 2D-рендеринге, как использовать agal для вычисления вершины по смещению x, y от программной константы

Я надеюсь, что кто-то может пролить свет на мой животрепещущий вопрос:

У меня есть текстура фиксированного размера 64x64. UV и вершина также фиксируются.

Теперь мне нужно переместить его в 2D-стадию.

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

Я обнаружил, что VertexBuffer3D.uploadFromByteArray требует значительного времени для обработки.

Я считаю, что должны быть более умные способы сделать это в agal.

Могу ли я передать смещение x, y в константных регистрах для Vertex Shade и вычислить размер вершины в agal?

Если это возможно, как я могу это сделать?


person teleme.io    schedule 22.11.2012    source источник
comment
Пожалуйста, закройте это. Был ответ, и это действительный ответ.   -  person jordancpaul    schedule 19.01.2013
comment
@jordancpaul Однако я добавил пример другого подхода, который также может быть полезен в некоторых случаях.   -  person skozin    schedule 10.02.2013


Ответы (2)


Загрузите свою геометрию один раз, а затем умножьте каждую вершину на матрицу Model-View-Perspective в вершинном шейдере. Матрицу можно передать вершинному шейдеру в константном регистре (учтите, что одна матрица 4x4 занимает 4 константных регистра). Вот хороший пример этого.

person Varnius    schedule 22.11.2012

Если матрицы MVP недостаточно и вам нужно манипулировать отдельными позициями вершин, вы можете использовать индексирование константных регистров. Но имейте в виду, что количество вершин, которые могут быть обработаны таким образом, ограничено, поскольку существует ограничение на количество регистров констант, доступных для вершинного шейдера (максимум 128 констант, включая вашу матрицу MVP).

  1. При построении геометрии назначьте каждой вершине уникальный идентификатор и загрузите его в данные вершины. Наименьший идентификатор должен равняться индексу первой константы, используемой для хранения смещений. Предположим, что этот наименьший идентификатор равен n0 и что идентификаторы хранятся в компоненте x регистра va1. Кроме того, поскольку в AGAL нет эквивалента кода операции PixelBender loadFloat, было бы неплохо установить некоторую начальную позицию для каждой вершины. Пусть хранится в va0.
  2. При каждом рендеринге сцены устанавливайте константы n0...(n0 + m - 1), где m — количество вершин. Вы можете хранить смещения x и y одной вершины внутри константы, используя тип данных Float2. Используя тип данных Float4, вы можете сохранить два дополнительных числа для каждой вершины (это может быть смещение цвета/текстуры или что-то еще). Также можно хранить смещения x-y двух последовательных вершин в одной константе, используя немного более сложный шейдер.
  3. В AGAL можно индексировать константные регистры вершинного шейдера (и только их, по крайней мере пока). Давайте воспользуемся этой функцией в нашем шейдере, чтобы получить данные для конкретной вершины:

    mov vt1 vc[va1.x] // obtain the offset from constants using vertex id
    add vt1 vt1 va0   // add the offset to the initial position of the vertex
    m44 op vt1 vc0    // multiply with MVP (assuming that it is stored in vc0...vc3)
    

Этот подход подходит для нескольких частных случаев, но не применим в общем случае.

person skozin    schedule 10.02.2013