Seringkali fitur perangkat keras yang serupa diekspos melalui DirectX dan OpenGL menggunakan terminologi yang berbeda.
Misalnya:
Constant Buffer / Uniform Buffer Object
RWBuffer / SSBO
Saya mencari bagan lengkap yang menggambarkan terminologi DirectX mana yang digunakan untuk merujuk pada konsep OpenGL mana, dan sebaliknya.
Di mana saya dapat menemukan sumber daya seperti itu?
Jawaban:
Saya belum dapat menemukan bagan semacam itu di web, jadi saya membuatnya di sini. (Semua orang, silakan menambahkan, menguraikan, atau memperbaiki kesalahan. Beberapa di antaranya hanya tebakan terbaik berdasarkan sebagian pemahaman tentang API dan internal perangkat keras.)
Dasar-dasar API
Shader
Geometri dan Gambar
Buffer dan Tekstur
Targetkan Render
Pertanyaan
Hitung Shader
Sumber Daya Lainnya
sumber
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
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
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
** 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
* ** RootSignature - tidak sama persis dengan VkPipelineLayout .
DX12 menggabungkan atribut vertex dan mengikat ke dalam satu deskripsi.
Gambar dan Buffer
Hambatan pada kedua API memecah sedikit berbeda, tetapi memiliki hasil bersih yang serupa.
RenderPasses / RenderTarget
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.
sumber
VkDescriptorPool
danID3D12DescriptorHeap
fungsinya serupa (dalam arti mereka adalah bagaimana Anda mengalokasikan deskriptor), tetapi dalam bentuk yang sangat berbeda, karena perbedaan dalam cara deskriptor keseluruhan ditangani antara API. Juga, saya membayangkan bahwa D3D12 setara denganVkBufferView
diketik buffer, seperti halnya untuk D3D11.