Зачастую аналогичная аппаратная функция предоставляется через DirectX и OpenGL с использованием другой терминологии.
Например:
Константа Буфер / Равномерный буфер объект
RWBuffer / SSBO
Я ищу исчерпывающую диаграмму, которая описывает, какая терминология DirectX используется для обозначения какой концепции OpenGL, и наоборот.
Где я могу найти такой ресурс?
Ответы:
Мне не удалось найти такой график в Интернете, поэтому я сделал его здесь. (Все, не стесняйтесь добавлять, уточнять или исправлять любые ошибки. Некоторые из них являются лишь лучшими догадками, основанными на частичном понимании API и аппаратных средств.)
Основы API
шейдеры
Геометрия и рисование
Буферы и текстуры
Рендеринг целей
Запросы
Вычислить шейдеры
Другие источники
источник
Вот неисчерпывающий список Vulkan и DirectX 12. Он составлен с использованием критериев, аналогичных критериям Натана.
В целом оба API удивительно похожи. Такие вещи, как этапы шейдера, остаются неизменными по сравнению с DX11 и OpenGL. И, очевидно, DirectX использует представления, чтобы сделать вещи видимыми для шейдеров. Vulkan также использует представления, но они встречаются реже.
Поведение видимости шейдера немного отличается между ними. Vulkan использует маску, чтобы определить, видим ли дескриптор на различных этапах шейдера. DX12 справляется с этим немного по-другому, видимость ресурсов выполняется либо на одном этапе, либо на всех этапах.
Я сломал набор параметров дескриптора / корневого параметра как мог. Обработка дескрипторов - одна из областей, которые сильно различаются между двумя API. Тем не менее, конечный результат довольно похож.
Основы API
Слой Vulkan WSI предоставляет изображения для цепочки обмена. DX12 требует создания ресурсов для представления изображения.
Общее поведение очереди довольно похоже между ними. При отправке из нескольких потоков есть некоторая особенность.
Постараюсь обновить, как я помню больше вещей ...
Командный буфер и пул
В словах о пуле команд / распределителе из документов Vulkan / DX12 поведение описывается совершенно другими словами, но фактическое поведение довольно похоже. Пользователи могут свободно выделять много буферов / списков команд из пула. Однако, только один буфер / список команд из пула может быть записан. Пулы не могут быть разделены между потоками. Таким образом, несколько потоков требуют нескольких пулов. Вы также можете начать запись сразу после отправки буфера / списка команд на обоих.
Список команд DX12 создается в открытом состоянии. Я нахожу это немного раздражающим, так как я привык к Вулкану. DX12 также требует и явного сброса распределителя команд и списка команд. Это необязательное поведение в Vulkan.
Дескрипторы
** RootParameter - не точный эквивалент VkDescriptorSetLayoutBinding, но похожее мышление в более широкой картине.
VkDescriptorPool и ID3D12DescriptorHeaps в некотором роде похожи (спасибо Николасу) в том, что они оба управляют распределением самих дескрипторов.
Следует отметить, что DX12 поддерживает не более двух куч дескрипторов, привязанных к списку команд в любой момент времени. Один CBVSRVUAV и один сэмплер. Вы можете иметь столько таблиц дескрипторов, сколько захотите, ссылаясь на эти кучи.
На стороне Vulkan существует жесткое ограничение на максимальное количество наборов дескрипторов, которые вы сообщаете пулу дескрипторов. В обоих случаях вам придется немного учесть количество дескрипторов для каждого типа, который может иметь пул / куча. Вулкан также более явный с типом дескрипторов. Принимая во внимание, что дескрипторы DX12 являются либо CBVSRVUAV, либо сэмплером.
DX12 также имеет функцию, с помощью которой вы можете сортировать CBV на лету, используя SetGraphicsRootConstantBufferView. Однако SRV-версия этого SetGraphicsRootShaderResourceView не работает с текстурами. Это в документации - но вам может понадобиться пара часов, чтобы понять это, если вы не внимательный читатель.
Трубопровод
* ** RootSignature - не точный эквивалент VkPipelineLayout .
DX12 объединяет атрибут вершины и привязку в одном описании.
Изображения и буферы
Барьеры на обоих API ломаются немного по-разному, но имеют одинаковый чистый результат.
RenderPasses / RenderTargets
У проходов рендеринга Vulkan есть хорошая функция автоматического разрешения. DX12 не имеет этого AFIAK. Оба API предоставляют функции для ручного разрешения.
Нет прямой эквивалентности между VkFramebuffer и любыми объектами в DX12. Коллекция ID3D12Resource, которая отображается на RTVs, является довольно схожей.
VkFramebuffer действует более или менее как пул вложений, на который VkRenderPass ссылается с помощью индекса. Подпроходы в VkRenderPass могут ссылаться на любое из вложений в VkFramebuffer, предполагая, что одно и то же вложение не упоминается более одного раза за подпроход. Максимальное количество используемых цветовых вложений ограничено значением VkPhysicalDeviceLimits.maxColorAttachments.
Цели рендеринга DX12 - это просто RTV, которые поддерживаются объектами ID3D12Resource. Максимальное количество одновременно используемых цветовых вложений ограничено D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Оба API требуют указания целей / проходов рендеринга при создании объектов конвейера. Тем не менее, Vulkan позволяет вам использовать совместимые проходы рендеринга, поэтому вы не привязаны к тем, которые вы указали при создании трубопровода. Я не тестировал его на DX12, но, думаю, поскольку это просто RTV, то же самое относится и к DX12.
источник
VkDescriptorPool
иID3D12DescriptorHeap
похожи на функции (в том , что они , как вы распределяете дескрипторы), но совершенно разные по форме, из - за различий в общем пути дескрипторы обрабатываются между API. Кроме того, я представляю, что D3D12 эквивалентенVkBufferView
типизированным буферам, так же как и для D3D11.