DirectX / OpenGL (Vulkan) діаграма відображення концепцій


32

Часто подібну апаратну функцію виставляють через DirectX та OpenGL з використанням різної термінології.

Наприклад:
Постійний буфер / Уніфікований
буферний об'єкт RWBuffer / SSBO

Я шукаю вичерпну діаграму, яка описує, яка термінологія DirectX використовується для позначення поняття OpenGL, і навпаки.
Де я можу знайти такий ресурс?


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
трихоплакс

Відповіді:


55

Мені не вдалося знайти таку діаграму в Інтернеті, тому я зробив її тут. (Кожен, не соромтеся додавати, розробляти чи виправляти будь-які помилки. Деякі з них - це лише найкращі здогадки, засновані на частковому розумінні API та апаратних засобів внутрішніх справ.)

Основи API

D3D11                          OpenGL 4.x
-----                          ----------
device                         context
immediate context              (implicit; no specific name)
deferred context               (no cross-vendor equivalent, but see
                                GL_NV_command_list)
swap chain                     (implicit; no specific name)
(no cross-vendor equivalent)   extensions
debug layer; info queue        GL_KHR_debug extension

Шейдери

D3D11              OpenGL 4.x
-----              ----------
pixel shader       fragment shader
hull shader        tessellation control shader
domain shader      tessellation evaluation shader
(vertex shader, geometry shader, and compute shader
 are called the same in both)

registers          binding points
semantics          interface layouts
SV_Foo semantics   gl_Foo builtin variables

class linkage      subroutines

(no equivalent)    program objects; program linking

(D3D11's normal
 behavior; no      separate shader objects
 specific name)

Геометрія та малювання

D3D11              OpenGL 4.x
-----              ----------
vertex buffer      vertex attribute array buffer; vertex buffer object
index buffer       element array buffer
input layout       vertex array object (sort of)

Draw               glDrawArrays
DrawIndexed        glDrawElements
(instancing and indirect draw are called similarly in both)
(no equivalent)    multi-draw, e.g. glMultiDrawElements​

stream-out         transform feedback
DrawAuto           glDrawTransformFeedback​

predication        conditional rendering
(no equivalent)    sync objects

Буфери та текстури

D3D11                    OpenGL 4.x
-----                    ----------
constant buffer          uniform buffer object
typed buffer             texture buffer
structured buffer        (no specific name; subset of SSBO features)
UAV buffer; RWBuffer     SSBO (shader storage buffer object)
UAV texture; RWTexture   image load/store

shader resource view     texture view
sampler state            sampler object

interlocked operations   atomic operations
append/consume buffer    SSBO + atomic counter

discard buffer/texture   invalidate buffer/texture
(no equivalent)          persistent mapping
(D3D11's normal
 behavior; no            immutable storage
 specific name)
(implicitly inserted     glMemoryBarrier; glTextureBarrier
 by the API)

Відображати цілі

D3D11                     OpenGL 4.x
-----                     ----------
(no equivalent)           framebuffer object
render target view        framebuffer color attachment
depth-stencil view        framebuffer depth-stencil attachment
multisample resolve       blit multisampled buffer to non-multisampled one

multiple render targets   multiple color attachments
render target array       layered image

(no equivalent)           renderbuffer

Запити

D3D11                       OpenGL 4.x
-----                       ----------
timestamp query             timer query
timestamp-disjoint query    (no equivalent)
(no equivalent)             time-elapsed query
occlusion query             samples-passed query
occlusion predicate query   any-samples-passed query
pipeline statistics query   (no equivalent in core, but see
                             GL_ARB_pipeline_statistics_query)
SO statistics query         primitives-generated/-written queries 
(no equivalent)             query buffer object

Обчислити шейдери

D3D11                     OpenGL 4.x
-----                     ----------
thread                    invocation
thread group              work group
thread group size         local size
threadgroup variable      shared variable

group sync                "plain" barrier
group memory barrier      shared memory barrier
device memory barrier     atomic+buffer+image memory barriers
all memory barrier        group memory barrier

Інші ресурси


3
Ого. Вони, мабуть, наймають найсміливіших умів у світі, щоб скласти найвиразніші імена для одних і тих же речей.
нартекс

Ця діаграма чудова, дякую, що ви знайшли час, щоб її записати!
витер

3
" текстурний масив - шаруваті зображення " OpenGL також називає їх текстурами масиву; термін "шаруватий образ" використовується в основному навколо їх вкладень у ФБО. Також, ймовірно, слід згадати об'єкти вибірки OpenGL та їх еквівалент D3D, стан вибірки.
Нікол Болас

2
@ CpCd0y Так, це вони розмовно називають, але моя мета тут полягала в тому, щоб сказати, як називаються ці речі / як вони представлені в API-ese.
Натан Рід

1
@NathanReed: MRT не використовується у специфікації OpenGL, але "запит на оклюзію" дуже є. Термін "пройдені зразки" - це лише один вид запиту оклюзії; є також "будь-які проби пройшли" і "консервативні будь-які проби пройшли".
Нікол Болас

28

Ось не вичерпний список Вулкана та 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.


Приємно, це чудова робота!
витер

Я думаю, було б справедливо сказати, що вони VkDescriptorPoolі ID3D12DescriptorHeapза функцією схожі (тим, що вони виділяють дескриптори), але зовсім інші за формою, через відмінності в загальному способі обробки дескрипторів між API. Крім того, я гадаю, що еквівалент D3D12 є введеними VkBufferViewбуферами, як і для D3D11.
Нікол Болас

Ви праві на дескрипторну купу. Оновлено. Щодо переглядів буфера, обидва API мають концепцію переглядів. Я не міг сказати, чи DX12 відірвався від конвенції DX1 введених буферів чи ні, оскільки я не маю особливого досвіду роботи з DX11.
кодуванняфорлов

Чи можете ви сказати, що цілі візуалізації D3D12 є еквівалентом VkFramebuffer?
Хорхе Родрігес

2
Натхненний цією темою, я написав реалізацію одного заголовка як Vulkan, так і DX12 рендерів: renderers: github.com/chaoticbob/tinyrenderers
кодуванняforlove
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.