Нарисуйте несколько сеток в разных местах (DirectX 12)

У меня проблема с DirectX 12. Я сделал небольшой 3D рендерер. Модели переводятся в трехмерное пространство в вершинном шейдере с базовыми матрицами проекции World View, которые находятся в постоянном буфере.

Чтобы изменить данные константного буфера я в настоящее время использую memcpy(pMappedConstantBuffer + alignedSize * frame, newConstantBufferData, alignedSize) эта команда немедленно заменяет данные постоянного буфера.


Таким образом, проблема возникает здесь, рисование записывается в список команд, который позже будет отправлен в gpu для выполнения.

Пример:

/* Now i want to change the constant buffer to change the next draw call's position to (0, 1, 0) */
memcpy(/*Parameters*/);

/* Now i want to record a draw call to the command list */
DrawInstanced(/*Parameters*/);

/* But now i want to draw other mesh to other position so i have to change the constant buffer. After this memcpy() the draw position will be (0, -1, 0) */
memcpy(/*Parameters*/);

/* Now i want to record new draw call to the list */
DrawInstanced(/*Parameters*/);

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


Таким образом, в основном вопрос заключается в том, как рисовать сетки в разные позиции или как заменить данные постоянного буфера в списке команд, чтобы постоянный буфер изменялся между каждым вызовом отрисовки в gpu?

Спасибо


Больше не нужна помощь, я решил это сам. Я создал постоянный буфер для каждой сетки.

2

Решение

Что касается порядка выполнения, вы совершенно правы, ваши вызовы memcpy немедленно обновят буферы, но команды не будут обрабатываться, пока вы не добавите список команд в очередь (и вы не будете точно знать, когда это произойдет).

В Direct3D11, когда вы используете Map в буфере, это обрабатывается для вас (некоторое пространство будет выделено, чтобы избежать этого при необходимости).

Так что в Direct3D12 у вас есть несколько вариантов, я буду считать, что вы хотите нарисовать N объектов, и вы хотите сохранить одну матрицу на объект в вашем cbuffer.

Сначала нужно создать один буфер для каждого объекта и установить данные независимо. Если у вас их всего несколько, это легко поддерживать (и дополнительный объем памяти из-за выделения ресурсов будет в порядке)

Другой вариант — создать большой буфер (который может содержать N матриц) и создать N постоянных представлений буфера, которые указывают на местоположение в памяти каждого объекта. (Обратите внимание, что в этом случае вы также должны соблюдать 256-байтовое выравнивание, см. CreateConstantBufferView).

Вы также можете использовать StructuredBuffer и скопировать в него все данные (в этом случае вам не нужно выравнивание), а также использовать индекс в вершинном шейдере для поиска правильной матрицы. (можно установить значение uint в вашем шейдере и использовать SetGraphicsRoot32BitConstant применять его напрямую).

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector