Często podobna funkcja sprzętowa jest udostępniana przez DirectX i OpenGL przy użyciu innej terminologii.
Na przykład:
Constant Buffer / Uniform Buffer Object
RWBuffer / SSBO
Szukam wyczerpującego wykresu, który opisuje, która terminologia DirectX jest używana w odniesieniu do której koncepcji OpenGL i odwrotnie.
Gdzie mogę znaleźć taki zasób?
Odpowiedzi:
Nie udało mi się znaleźć takiego wykresu w Internecie, więc zrobiłem go tutaj. (Każdy może dodawać, opracowywać lub poprawiać wszelkie błędy. Niektóre z nich to po prostu najlepsze domysły oparte na częściowym zrozumieniu interfejsu API i wewnętrznych elementów sprzętowych).
Podstawy API
Shadery
Geometria i rysunek
Bufory i tekstury
Renderuj cele
Zapytania
Compute Shaders
Inne zasoby
źródło
Oto niewyczerpująca lista Vulkan i DirectX 12. Jest to zestawione razem przy użyciu kryteriów podobnych do kryteriów Nathana.
Ogólnie oba interfejsy API są zaskakująco podobne. Rzeczy takie jak stopnie cieniowania pozostają niezmienione od DX11 i OpenGL. I oczywiście DirectX używa widoków, aby rzeczy były widoczne dla shaderów. Vulkan korzysta również z widoków, ale są one rzadsze.
Zachowanie widoczności modułu cieniującego różni się nieco między nimi. Vulkan używa maski, aby ustalić, czy deskryptor jest widoczny dla różnych stopni shadera. DX12 radzi sobie z tym trochę inaczej, widoczność zasobów odbywa się na jednym etapie lub na wszystkich etapach.
Zepsułem zestaw deskryptorów / parametry parametru root najlepiej, jak mogłem. Obsługa deskryptorów jest jednym z obszarów, które różnią się znacznie między dwoma interfejsami API. Jednak wynik końcowy jest dość podobny.
Podstawy API
Warstwa WSI Vulkan dostarcza obrazy do wymiany. DX12 wymaga zasobów do tworzenia obrazu.
Ogólne zachowanie w kolejce jest dość podobne między nimi. Podczas przesyłania z wielu wątków jest trochę dziwactwa.
Spróbuję zaktualizować, ponieważ pamiętam więcej rzeczy ...
Bufor poleceń i pula
Verbage na temat puli poleceń / alokatora z dokumentów Vulkan / DX12 podaje zachowanie w bardzo różnych słowach - ale rzeczywiste zachowanie jest dość podobne. Użytkownicy mogą przydzielić wiele buforów / list poleceń z puli. Jednak tylko jeden bufor / lista poleceń z puli może nagrywać. Pule nie mogą być dzielone między wątkami. Tak więc wiele wątków wymaga wielu pul. Możesz także rozpocząć nagrywanie natychmiast po przesłaniu bufora / listy poleceń na oba.
Lista poleceń DX12 jest tworzona w stanie otwartym. Uważam to za trochę denerwujące, ponieważ jestem przyzwyczajony do Vulkanu. DX12 wymaga również jawnego zresetowania alokatora poleceń i listy poleceń. Jest to opcjonalne zachowanie w Vulkan.
Deskryptory
** RootParameter - nie jest to dokładny odpowiednik VkDescriptorSetLayoutBinding, ale podobne myślenie na większym obrazie.
VkDescriptorPool i ID3D12DescriptorHeaps są trochę podobne (dzięki Nicolas), ponieważ oba zarządzają alokacją samych deskryptorów.
Należy zauważyć, że DX12 obsługuje tylko dwa stosy deskryptorów powiązane z listą poleceń w danym momencie. Jeden CBVSRVUAV i jeden próbnik. Możesz mieć tyle tabel deskryptorów, ile chcesz odwoływać się do tych hałd.
Po stronie Vulkan istnieje sztywny limit maksymalnej liczby zestawów deskryptorów, które podajesz puli deskryptorów. W obu przypadkach należy wykonać ręczne rozliczanie liczby deskryptorów według typu, jaką może mieć pula / sterta. Vulkan jest również bardziej jednoznaczny z typem deskryptorów. Natomiast na DX12 deskryptory to CBVSRVUAV lub sampler.
DX12 ma również funkcję, dzięki której można w pewien sposób powiązać CBV w locie za pomocą SetGraphicsRootConstantBufferView. Jednak wersja SRV tego SetGraphicsRootShaderResourceView nie działa na teksturach. Jest w dokumentacji - ale może to potrwać kilka godzin, aby dowiedzieć się o tym, jeśli nie jesteś uważnym czytelnikiem.
Rurociąg
* ** RootSignature - nie jest to dokładny odpowiednik VkPipelineLayout .
DX12 łączy atrybut wierzchołka i wiązanie w jeden opis.
Obrazy i bufory
Bariery w obu interfejsach API rozkładają się nieco inaczej, ale mają podobny wynik netto.
RenderPasses / RenderTargets
Przepustki renderujące Vulkan mają niezłą funkcję automatycznego rozpoznawania. DX12 nie ma tego AFIAK. Oba interfejsy API zapewniają funkcje ręcznego rozwiązywania.
Nie ma bezpośredniej równoważności między VkFramebuffer a dowolnymi obiektami w DX12. Zbiór ID3D12Resource odwzorowany na RTV jest luźnym podobieństwem.
VkFramebuffer działa mniej więcej jak pula załączników, do których odwołuje się VkRenderPass przy użyciu indeksu. Podpody w VkRenderPass mogą odwoływać się do dowolnego załącznika w VkFramebuffer, zakładając, że ten sam załącznik nie jest wywoływany więcej niż raz na podpass. Maksymalna liczba załączników kolorów używanych jednocześnie jest ograniczona do VkPhysicalDeviceLimits.maxColorAttachments.
Cele renderowania DX12 to tylko RTV, które są wspierane przez obiekty ID3D12Resource. Maksymalna liczba załączników kolorowych używanych jednocześnie jest ograniczona do D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Oba interfejsy API wymagają określenia celów renderowania / przebiegów przy tworzeniu obiektów potoku. Jednak Vulkan pozwala na używanie zgodnych przejść renderowania, więc nie jesteś zablokowany w tych, które określisz podczas tworzenia potoku. Nie testowałem tego na DX12, ale zgaduję, że to tylko RTV, to samo dotyczy DX12.
źródło
VkDescriptorPool
iID3D12DescriptorHeap
mają one podobną funkcję (w tym sensie, jak przydzielają deskryptory), ale mają zupełnie inną formę ze względu na różnice w ogólnym sposobie obsługi deskryptorów między interfejsami API. Wyobrażam sobie również, że odpowiednikiem D3D12VkBufferView
jest bufor buforowany, tak jak w przypadku D3D11.