Berikut daftar Vulkan dan DirectX yang tidak lengkap. Ini dirangkai menggunakan kriteria yang mirip dengan milik Nathan.
Secara keseluruhan kedua API sangat mirip. Hal-hal seperti tahap shader tetap tidak berubah dari DX11 dan OpenGL. Dan jelas, DirectX menggunakan pandangan untuk membuat sesuatu terlihat oleh shader. Vulkan juga menggunakan pandangan, tetapi mereka kurang sering.
Perilaku visibilitas shader sedikit berbeda antara keduanya. Vulkan menggunakan topeng untuk menentukan apakah deskriptor terlihat ke berbagai tahapan shader. DX12 menangani ini sedikit berbeda, visibilitas sumber daya dilakukan pada satu tahap atau semua tahap.
Saya memecahkan hal-hal set / root parameter deskripsinya sebisa mungkin. Penanganan deskriptor adalah salah satu area yang sangat bervariasi antara kedua API. Namun, hasil akhirnya cukup mirip.
Dasar-dasar 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
Lapisan WSI Vulkan memasok gambar untuk swapchain. DX12 membutuhkan sumber daya kreasi untuk mewakili gambar.
Perilaku antrian umum sangat mirip antara keduanya. Ada sedikit keanehan ketika mengirimkan dari beberapa utas.
Akan mencoba memperbarui karena saya ingat lebih banyak barang ...
Command Buffer and Pool
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
Verbiage tentang kumpulan perintah / pengalokasi dari dokumen Vulkan / DX12 menyatakan perilaku dengan kata-kata yang sangat berbeda - tetapi perilaku sebenarnya sangat mirip. Pengguna bebas untuk mengalokasikan banyak buffer perintah / daftar dari kumpulan. Namun, hanya satu buffer perintah / daftar dari kumpulan yang dapat merekam. Pools tidak dapat dibagi antara utas. Jadi beberapa utas membutuhkan banyak kumpulan. Anda juga dapat mulai merekam segera setelah mengirimkan perintah buffer / daftar di keduanya.
Daftar perintah DX12 dibuat dalam keadaan terbuka. Saya menemukan ini agak menjengkelkan karena saya sudah terbiasa dengan Vulkan. DX12 juga membutuhkan dan secara eksplisit mengatur ulang pengalokasi perintah dan daftar perintah. Ini adalah perilaku opsional di Vulkan.
Penjelas
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** RootParameter - tidak sama persis dengan VkDescriptorSetLayoutBinding tetapi pemikiran serupa pada gambar yang lebih besar.
VkDescriptorPool dan ID3D12DescriptorHeaps agak mirip (terima kasih Nicolas) karena mereka berdua mengelola alokasi deskriptor itu sendiri.
Perlu dicatat bahwa DX12 hanya mendukung paling banyak dua deskriptor tumpukan terikat ke daftar perintah pada waktu tertentu. Satu CBVSRVUAV dan satu sampler. Anda dapat memiliki tabel deskriptor sebanyak yang Anda inginkan merujuk tumpukan ini.
Di sisi Vulkan, ada batasan keras untuk jumlah set deskriptor maksimum yang Anda beri tahu kumpulan deskriptor. Pada keduanya Anda harus melakukan sedikit akuntansi manual pada jumlah deskriptor per jenis pool / heap dapat miliki. Vulkan juga lebih eksplisit dengan jenis deskriptor. Sedangkan pada penjelas DX12 adalah CBVSRVUAV atau sampler.
DX12 juga memiliki fitur untuk mengikat CBV dengan cepat menggunakan SetGraphicsRootConstantBufferView. Namun, versi SRV ini, SetGraphicsRootShaderResourceView, tidak berfungsi pada tekstur. Ada dalam dokumen - tetapi mungkin juga akan memakan waktu beberapa jam untuk mencari tahu jika Anda bukan pembaca yang cermat.
Saluran pipa
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature - tidak sama persis dengan VkPipelineLayout .
DX12 menggabungkan atribut vertex dan mengikat ke dalam satu deskripsi.
Gambar dan Buffer
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
Hambatan pada kedua API memecah sedikit berbeda, tetapi memiliki hasil bersih yang serupa.
RenderPasses / RenderTarget
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
Vulkan render pass memiliki fitur penyelesaian otomatis yang bagus. DX12 tidak memiliki AFIAK ini. Kedua API menyediakan fungsi untuk penyelesaian manual.
Tidak ada kesetaraan langsung antara VkFramebuffer dan objek apa pun di DX12. Kumpulan ID3D12Resource yang memetakan ke RTV adalah kesamaan yang longgar.
VkFramebuffer bertindak kurang lebih seperti kumpulan lampiran yang VkRenderPass referensi menggunakan indeks. Subpass dalam VkRenderPass dapat mereferensikan salah satu lampiran dalam VkFramebuffer dengan asumsi lampiran yang sama tidak dirujuk lebih dari satu kali per subpass. Jumlah maksimum lampiran warna yang digunakan sekaligus terbatas pada VkPhysicalDeviceLimits.maxColorAttachments.
Target render DX12 hanyalah RTV yang didukung oleh objek ID3D12Resource. Jumlah maksimum lampiran warna yang digunakan sekaligus dibatasi hingga D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8).
Kedua API mengharuskan Anda untuk menentukan target render / melewati pada pembuatan objek pipa. Namun, Vulkan memungkinkan Anda untuk menggunakan pass render yang kompatibel, sehingga Anda tidak terkunci pada yang Anda tentukan selama pembuatan pipeline. Saya belum mengujinya di DX12, tapi saya kira karena itu hanya RTV, ini juga berlaku pada DX12.