Привязка дескриптора Vulkan - PullRequest
0 голосов
/ 24 апреля 2018

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

Updatedescriptorsets(texture)

Command buffer record
{
 For each mesh
        Bind transformubo
        Draw mesh
}

Но теперь я хочу, чтобы каждая сетка имела уникальную текстуру, поэтому я попробовал это

Command buffer record
{
 For each mesh
        Bind transformubo
        Updatedescriptorsets (textures[meshindex])
        Draw mesh
}

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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

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

Что вам в основном нужно сделать, это обновить наборы дескрипторов, прежде чем связывать их.

Это странное поведение присутствует, потому что в vkCmdBindDescriptorSets некоторые реализации принимают набор дескрипторов vulkan, переводят его в таблицы собственных дескрипторов и затем сохраняют его в буфере команд. Поэтому, если вы обновите дескриптор, установленный после vkCmdBindDescriptorSets, буфер команд будет видеть устаревшие данные. VK_EXT_descriptor_indexing расширение ослабило это поведение при некоторых обстоятельствах.

0 голосов
/ 24 апреля 2018

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

Это в основном похоже на глобальную переменную;Вы не можете иметь людей, обращающихся к глобальной переменной из многочисленных потоков без какой-либо синхронизации.И Vulkan не синхронизирует доступ к наборам дескрипторов.

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

Вы можете использовать постоянные данные для индексации больших таблиц / текстур массивов.Таким образом, набор дескрипторов будет иметь массив текстур или массив текстур (если у вас есть динамическая индексация для массивов текстур).Константа push обеспечивает индекс, который используется шейдером для извлечения текстуры конкретного объекта из массива texture / array of textures.Это делает частые изменения довольно дешевыми, и тот же индекс может также использоваться для предоставления каждому объекту своих матриц преобразования (путем выборки в массив матриц).

Если у вас есть доступное расширение VK_KHR_push_descriptor, то вы можетеинтегрировать изменения в дескрипторы непосредственно в буфер команд.Насколько это лучше, чем механизм push-константы, конечно, зависит от реализации.

...