Несколько VkDescriptorSetLayout для одного и того же VkPipeline? - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть две сущности, которые должны отображаться с одинаковыми VkPipeline, проблема в том, что они имеют разные VkDescriptorSetLayout (первые сущности используют динамические унифицированные буферы, вторые только стандартные унифицированные буферы);

Как передать оба VkDescriptorSetLayout в графический конвейер, а затем связать правильный при создании буфера команд?

С одним VkDescriptorSetLayout я просто передаю его в VkPipelineLayoutCreateInfo.pSetLayouts, а затемвызовите VkCmdBindDescriptorSet с этим VkPipelineLayout.

Но с двумя VkDescriptorSetLayouts как правильно связать их с VkPipelineLayout, а затем как выбрать тот, который я хочу во время буферизации команд?

1 Ответ

0 голосов
/ 17 февраля 2019

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

Тогда они не имеют одинаковые VkPipeline.Является ли однородный буфер динамическим или нет, это часть конвейера , поскольку он является частью компоновки наборов дескрипторов этого конвейера.

Конвейеры могут иметь несколько наборов дескрипторов, но каждый набор представляетнабор ресурсов, , ко всем из которых конвейер может получить доступ одновременно.В вашем коде шейдера это то, что означает layout(set = #, descriptor = #);единообразный блок в шейдере относится к конкретному дескриптору в пределах определенного набора индексов .И он всегда будет ссылаться на этот конкретный дескриптор в указанном индексе набора.И то, является ли этот конкретный дескриптор в этом конкретном наборе динамическим или нет, является частью VkDescritorSetLayout, используемого VkPipelineLayout, используемого для создания объекта VkPipeline.

Определенный набор дескрипторов в макете конвейеране может иметь два набора.Это не имеет смысла.

Чтобы сделать то, что вы хотите, необходимо создать два отдельных VkPipeline объекта.Одно может быть производным от другого, чтобы подсказывать реализации, что изменения между ними не будут особенно большими.Но вам нужно два конвейера.

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

...