Отправка больших массивов параметров в шейдер GPU - PullRequest
2 голосов
/ 30 января 2012

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

Сплайн состоит из множества секций, каждый из которых описывается кубическими уравнениями для x / y / z, например, x (t) = at ^ 3 + bt ^ 2 + ct + d, поэтому каждая секция может быть красиво определена с помощью матрицы или несколько значений float4.

Но так как сплайн может легко иметь 100 секций, это означает, что шейдер должен работать с массивом 400-1000 значений float4. Как начинающий программист GPU, это приводит к нескольким вопросам:

  1. Каков вероятный прирост производительности при установке массива такого размера для меша, который должен быть визуализирован? Незначительный или серьезный?
  2. Каковы ограничения на размеры массивов и как они варьируются в зависимости от графических процессоров, которые в настоящее время встречаются в реальном мире? Каковы конкретные названия терминов, на которые я должен обратить внимание, чтобы выяснить это для данного графического процессора?

Общие советы по работе с такого рода подходом также приветствуются, поскольку я точно не знаю, о чем я должен спрашивать!

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

1 Ответ

2 голосов
/ 03 февраля 2012

Как правило, отображение геометрии на сплайн на уровне вершинного шейдера не совсем тривиально (и концептуально).Обратная связь преобразования (которая поддерживается на оборудовании DX10), вероятно, вам захочется рассмотреть.Таким образом, вам не нужно выполнять вычисления для каждого кадра для каждой вершины, только при изменении сплайна.

Это также немного зависит от того, что именно вы хотите.Например, если вы хотите разместить объекты на сплайне, но не деформировать сами объекты, это может быть допустимым вариантом для оценки только происхождения каждого объекта в первом проходе(преобразовать обратную связь снова) и использовать это в качестве входных данных для преобразования всех вершин позже.Возможно использование идентификатора экземпляра или использование отдельного атрибута вершины для индексации этих данных.

Объявление 1:
Накладные расходы на установку one равно(более или менее) так же, как накладные расходы на установку тысячи форм.Задержка конвейера и задержка DMA являются доминирующими факторами, и они возникают, как только вы касаетесь одного значения.
Вам нужно как можно меньше изменений состояния (независимо от того, насколько «велико») между вызовами отрисовки.

Объявление 2:
D3D10 требует как минимум 4096 векторов из четырех 32-битных значений на постоянный буфер, из которых вы можете иметь одновременно 14.
OpenGL 3.0 (которыйверсия «примерно для карт класса DX10»), как обычно, немного мягче в своей формулировке и более смягчена до минимальных значений.Должно поддерживаться не менее 36 привязок не менее 16384 машинных слов, из которых в вершинном шейдере должно быть не менее 1024 4-кортежей [1] .
Реально можно ожидать "достаточно" (я никогда не видел ничего ниже 65536).

Кроме того, карта, совместимая с D3D10, независимо от того, насколько плохой должна поддерживать как 16, так и 32-битные 4-компонентные текстуры с плавающей точкой в аппаратном обеспечении.Минимально допустимый максимальный размер текстуры составляет 8192 .
Аналогично, OpenGL 3.0 требует 16/32-битных данных / текстур вершин и пикселей и требует как минимум поддерживаемый размер текстуры 1024 (хотя я никогда не виделanythng меньше 8192).

Это означает, что если формы / константы оказываются неподходящими, вы можете альтернативно прочитать данные сплайна из текстуры.Для одного сплайна, например, это может быть текстура 1x1024, но приятно то, что если у вас есть, например, 20 сплайнов, вы можете иметь их все в одной текстуре (каждый в строке) и просто изменить координату текстуры так,Вы пробуете другую линию.Это, возможно, может полностью исключить задержки конвейера.
Кроме того, в OpenGL 3.1 были представлены объекты текстурного буфера, которые являются одномерными текстурами специально для этой цели.Минимально допустимый максимальный размер составляет 65536, реальные значения намного выше (моя карта сообщает 134217728).
Мне не хватает специалиста по D3D, но почти любой D3D10-совместимой карте с последними драйверамиподдерживает OpenGL 3.1, так как аппаратное обеспечение поддерживает его, вполне уверен, что D3D имеет аналогичную (немного по-другому) функцию.

...