2015-08-16 3 views
2

Если я генерирую 0-12 треугольников в вычислительном шейдере, есть ли способ, по которому я могу передать их в буфер, который затем будет использоваться для рендеринга на экран?Динамический вывод из вычислительного шейдера

Моя текущая стратегия:

  • создать буфер float3 размера threads * 12, поэтому можно сохранить максимально возможное количество треугольников;
  • пишите в буфер, используя индекс, который зависит от положения нити в сетке, поэтому нет условий гонки.

Если я хочу сделать из этого, хотя, я должен был бы пропустить пустую память. Это звучит уродливо, но, вероятно, в настоящее время нет другого пути. Я знаю, что шейдеры геометрии CUDA могут иметь выход переменной длины, но мне интересно, могут ли/i игры iOS генерировать данные переменной длины на графическом процессоре.

UPDATE 1:

Как только я написал вопрос, я подумал о возможности использования второго буфера, который будет указывать, сколько треугольников доступны для каждого блока . Затем вершинный шейдер обрабатывал все вершины всех треугольников этого блока.

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

ответ

3

Что вы ищете, это металлический эквивалент D3D «AppendStructuredBuffer». Вы хотите тип, который может иметь структуры, добавленные к нему атомарно.

Я не знаком с металлом, но он поддерживает Atomic operations, например «Добавить», что вам действительно нужно, чтобы катить собственный буфер добавления. Инициализируйте счетчик на 0 и добавьте каждый поток к счетчику «1» и используйте исходное значение в качестве индекса для записи в буфер.

+0

Это именно то, что я придумал: увеличивать счетчик атомарно до _reserve_ определенной зоны буфера, а затем записывать в буфер. В конце прохода скопируйте буфер для визуализации буфера, используя атомный размер int и удалите рабочий буфер. – aledalgrande

Смежные вопросы