DX11 Динамический размер буфера

Я пытаюсь сделать деформируемый воксельный ландшафт для проекта для университета. В настоящее время я использую несколько 3DTextures для хранения моих данных вокселей в «кусках». Мой план состоял в том, чтобы использовать вычислительный шейдер для выполнения алгоритма марширующих кубов на указанных данных вокселей и вывода вершин в буфер, который затем можно визуализировать в каждом кадре.

Проблема в том, что для настройки БПЛА для структурированного буфера, который я использую, мне нужно знать, сколько элементов у него будет для NumElements в D3D11_BUFFER_UAV. Я могу догадаться о максимуме, который он может содержать, но у меня нет никакого способа узнать, сколько это будет на самом деле, пока не закончится вычислительный шейдер, и мне пришло в голову, что это может быть не лучшим способом решения проблемы. ,

Все, что мне действительно нужно, — это заставить вычислительный шейдер выдавать произвольное количество вершин, которые могут быть сохранены и обработаны позже, какие-нибудь идеи о том, как это сделать?

1

Решение

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

Если кто-нибудь придумает лучшее решение, я буду рад его услышать.

0

Другие решения

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

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

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

0

По вопросам рекламы [email protected]