İşte Vulkan ve DirectX 12'nin kapsamlı olmayan bir listesi. Bu, Nathan'ınkine benzer kriterler kullanılarak bir araya toplanmıştır.
Genel olarak her iki API de şaşırtıcı şekilde benzerdir. Gölgelendirici kademeleri gibi şeyler DX11 ve OpenGL'de değişmeden kalır. Ve açıkçası, DirectX gölgeleri görünür hale getirmek için görünümleri kullanır. Vulkan da görüşler kullanır, ancak daha az sıklıkta görülürler.
Gölgelendirici görünürlük davranışı, ikisi arasında biraz farklılık gösterir. Vulkan, bir tanımlayıcının çeşitli gölgelendirici aşamaları tarafından görülebilir olup olmadığını belirlemek için bir maske kullanır. DX12 bunu biraz farklı şekilde ele alır, kaynak görünürlüğü tek aşamada veya tüm aşamalarda yapılır.
Tanımlayıcı set / root parametresi öğelerini elimden geldiğince kırdım. Tanımlayıcı kullanımı, iki API arasında büyük ölçüde değişen alanlardan biridir. Ancak, sonuç oldukça benzer.
API Temelleri
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
Vulkan'ın WSI katmanı, swapchain için görüntü sağlar. DX12, görüntüyü temsil etmek için oluşturma kaynakları gerektirir.
Genel kuyruk davranışı, ikisi arasında oldukça benzerdir. Birden fazla iş parçacığından gönderirken biraz idiosyncrasy var.
Daha fazla şey hatırladığım için güncelleme yapmaya çalışacağım ...
Komut Tamponu ve Havuzu
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
Vulkan / DX12 dokümanlarından komut havuzu / allocator hakkındaki sözler, davranışı çok farklı kelimelerle ifade eder - fakat gerçek davranış oldukça benzerdir. Kullanıcılar havuzdan birçok komut tamponu / liste atayabilirler. Ancak, havuzdan yalnızca bir komut arabelleği / listesi kaydedilebilir. Havuzlar dişler arasında paylaşılamaz. Bu yüzden birden fazla iş parçacığı birden fazla havuz gerektirir. Her ikisine de tampon / list komutunu gönderdikten hemen sonra kayda başlayabilirsiniz.
DX12 komut listesi açık durumda oluşturulur. Bunu Vulkan'a alışkın olduğum için biraz can sıkıcı buluyorum. DX12 ayrıca komut ayırıcı ve komut listesinin sıfırlanmasını gerektirir ve açıkça sıfırlar. Bu Vulkan'da isteğe bağlı bir davranış.
Tanıtıcılar
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** RootParameter - değil kesin eşdeğer VkDescriptorSetLayoutBinding ama büyük resimde benzer düşünce.
VkDescriptorPool ve ID3D12DescriptorHeaps, her ikisi de tanımlayıcıların kendilerine tahsis edilmesini yönetmesi bakımından benzerdir (teşekkürler Nicolas).
DX12'nin herhangi bir zamanda yalnızca bir komut listesine bağlı en fazla iki tanımlayıcı yığınını desteklediğine dikkat edilmelidir. Bir CBVSRVUAV ve bir örnekleyici. Bu yığınlara referans vermek istediğiniz kadar tanımlayıcı tabloya sahip olabilirsiniz.
Vulkan tarafında, tanımlayıcı havuzuna söylediğiniz maksimum tanımlayıcı kümesi sayısı için katı bir sınır vardır. Her ikisinde de, havuz / yığının sahip olabileceği tür başına tanımlayıcı sayısı üzerinde bir miktar manuel muhasebe yapmanız gerekir. Vulkan ayrıca, tanımlayıcı türleriyle daha da belirgindir. Oysa DX12'de tanımlayıcılar CBVSRVUAV veya örnekleyicidir.
DX12 ayrıca SetGraphicsRootConstantBufferView kullanarak anında bir CBV'yi bağlayabileceğiniz bir özelliğe sahiptir. Ancak, bunun SRV sürümü, SetGraphicsRootShaderResourceView, dokular üzerinde çalışmaz. Bu dokümanlardaydı - ancak dikkatli bir okuyucu değilseniz bunu çözmeniz birkaç saat sürebilir.
Boru hattı
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature - değil tam denk VkPipelineLayout .
DX12, köşe niteliğini ve ciltlemeyi tek bir tanımda birleştirir.
Resimler ve Tamponlar
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
Her iki API'deki engeller biraz farklı olsa da, benzer net sonuçlara yol açar.
RenderPasses / RenderTargets
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
Vulkan render pass'leri hoş bir otomatik çözme özelliğine sahiptir. DX12 bu AFIAK'a sahip değil. Her iki API de manuel çözümleme için işlevler sağlar.
VkFramebuffer ve DX12'deki herhangi bir nesne arasında doğrudan bir denklik yoktur. RTV'lerle haritalanan bir ID3D12Resource koleksiyonu gevşek bir benzerliktir.
VkFramebuffer, VkRenderPass'ın bir dizin kullanarak başvurduğu bir ek havuzu gibi aşağı yukarı hareket eder. Bir VkRenderPass içindeki alt geçitler, aynı ekin her alt geçişte birden fazla referans alınmadığını varsayarak bir VkFramebuffer içindeki eklerin herhangi birine başvurabilir. Bir seferde kullanılan maksimum renk eki sayısı VkPhysicalDeviceLimits.maxColorAttachments ile sınırlıdır.
DX12'nin oluşturma hedefleri yalnızca bir ID3D12Resource nesnesi tarafından desteklenen RTV'lerdir. Bir kerede kullanılan maksimum renk eki sayısı, D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8) ile sınırlıdır.
Her iki API de, boru hattı nesnelerinin oluşturulmasında oluşturma hedeflerini / geçişlerini belirtmenizi gerektirir. Bununla birlikte, Vulkan uyumlu oluşturma geçişleri kullanmanıza izin verir, bu nedenle boru hattı oluşturma sırasında belirlediklerinize kilitlenmezsiniz. DX12'de test etmedim, ancak sanırım sadece bir RTV olduğundan, bu DX12 için de geçerli.