Ось не вичерпний список Вулкана та DirectX 12. Це об'єднано за допомогою критеріїв, аналогічних критериям Натана.
В цілому обидва API є напрочуд подібними. Такі речі, як шейдерні етапи, залишаються незмінними від DX11 та OpenGL. І очевидно, DirectX використовує представлення, щоб зробити речі видимими для шейдерів. Вулкан також використовує погляди, але вони рідше.
Поведінка видимості шейдера дещо відрізняється між ними. Вулкан використовує маску, щоб визначити, чи видно дескриптор для різних ступенів шейдера. DX12 це обробляє дещо інакше, видимість ресурсів робиться на одному етапі або на всіх етапах.
Я розбив набір дескрипторів / параметр кореневих параметрів найкраще, наскільки я міг. Обробка дескриптора - одна з областей, що сильно відрізняються між двома API. Однак кінцевий результат досить схожий.
Основи API
Vulkan DirectX 12
--------------- ---------------
n/a IDXGIFactory4
VkInstance n/a
VkPhysicalDevice IDXGIAdapter1
VkDevice ID3D12Device
VkQueue ID3D12CommandQueue
VkSwapchain IDXGISwapChain3
VkFormat DXGI_FORMAT
SPIR-V D3D12_SHADER_BYTECODE
VkFence fences
VkSemaphore n/a
VkEvent n/a
Шар WSI Vulkan забезпечує зображення для свопчан. Для представлення зображення DX12 вимагає ресурсів створення.
Загальна поведінка в черзі досить однакова між обома. Під час надсилання з декількох потоків є трохи ідіосинкразії.
Спробую оновити, як я пам’ятаю більше речей ...
Буфер команди та басейну
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
Багатослівність про командний пул / алокатор з документів Vulkan / DX12 констатує поведінку дуже різними словами - але реальна поведінка досить схожа. Користувачі можуть виділяти з пулу багато буферів / списків команд. Однак може бути записаний лише один командний буфер / список із пулу. Басейни не можна ділити між потоками. Таким чином, для декількох потоків потрібно кілька пулів. Ви також можете розпочати запис відразу після подання буфера / списку команд на обох.
Список команд DX12 створюється у відкритому стані. Мені це трохи дратує, оскільки я звик до Вулкана. DX12 також вимагає явного скидання розподільника команд та списку команд. Це необов'язкова поведінка у Вулкані.
Дескриптори
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** RootParameter - не точний еквівалент VkDescriptorSetLayoutBinding, але подібне мислення у більшій картині.
VkDescriptorPool і ID3D12DescriptorHeaps подібні (спасибі Ніколя) тим, що вони обидва керують розподілом дескрипторів.
Слід зазначити, що DX12 підтримує лише максимум два набори дескриптора, пов'язані зі списком команд у будь-який момент часу. Один CBVSRVUAV та один пробовідбірник. Ви можете мати стільки таблиць дескрипторів, скільки потрібно посилатись на ці купи.
З боку Вулкана існує жорстке обмеження максимальної кількості наборів дескрипторів, які ви повідомляєте пулу дескрипторів. І для обох ви повинні зробити трохи ручного обліку кількості дескрипторів для типу пулу / купи. Вулкан також більш чіткий з типом дескрипторів. Тоді як дескриптори DX12 є або CBVSRVUAV, або вибіркою.
DX12 також має функцію, за якою ви можете сортувати прив’язку CBV під час руху за допомогою SetGraphicsRootConstantBufferView. Однак версія SRV цього, SetGraphicsRootShaderResourceView, не працює над текстурами. Це в документах - але також може знадобитися кілька годин, щоб це зрозуміти, якщо ви не уважний читач.
Трубопровід
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature - не точний еквівалент VkPipelineLayout .
DX12 поєднує атрибут вершини та прив'язку до єдиного опису.
Зображення та буфери
Vulkan DirectX 12
--------------- ---------------
VkImage ID3D12Resource
VkBuffer ID3D12Resource
uniform buffer constant buffer
index buffer index buffer
vertex buffer vertex buffer
VkSampler sampler
barriers/transitions barriers/transitions
Бар'єри в обох API розбиваються трохи по-різному, але мають подібний чистий результат.
RenderPasses / RenderTargets
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
Проходи для візуалізації Vulkan мають гарну функцію автоматичного вирішення. У DX12 немає цього AFIAK. Обидва API надають функції для ручного вирішення.
Немає прямої еквівалентності між VkFramebuffer та будь-якими об’єктами в DX12. Колекція ID3D12Ресурс, який відображається на RTV, є мало схожою.
VkFramebuffer діє більш-менш як пул вкладень, на який VkRenderPass посилається, використовуючи індекс. Підпункти в межах VkRenderPass можуть посилатися на будь-яке вкладення у VkFramebuffer, припускаючи, що на те саме вкладення не посилається більше одного разу на підданий. Максимальна кількість кольорових вкладень, що використовуються одночасно, обмежена VkPhysicalDeviceLimits.maxColorAttachments.
Цілі візуалізації DX12 - це просто RTV, які підтримуються об'єктами ID3D12Resource. Максимальна кількість кольорових вкладених файлів, що використовуються одночасно, обмежена D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Обидва API вимагають вказати цілі / проходи візуалізації при створенні об'єктів конвеєра. Однак Vulkan дозволяє використовувати сумісні проходи візуалізації, тому ви не заблоковані в тих, які ви вказали під час створення трубопроводу. Я не тестував його на DX12, але я б здогадався, оскільки це просто RTV, це також стосується DX12.