Grafik pemetaan konsep DirectX / OpenGL (Vulkan)


32

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?


Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
trichoplax

Jawaban:


55

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

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

Shader

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)

Geometri dan Gambar

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

Buffer dan Tekstur

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)

Targetkan Render

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

Pertanyaan

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

Hitung Shader

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

Sumber Daya Lainnya


3
Wow. Mereka mungkin mempekerjakan pikiran paling tangguh di dunia untuk membuat nama paling berbeda untuk hal yang sama.
narthex

Bagan itu bagus, terima kasih telah meluangkan waktu untuk menuliskannya!
usap

3
" text array - layered image " OpenGL juga menyebutnya Array Textures; istilah "gambar berlapis" digunakan terutama di sekitar lampiran mereka di FBO. Juga, Anda mungkin harus menyebutkan objek sampler OpenGL dan D3D yang setara, keadaan sampler.
Nicol Bolas

2
@ CpCd0y Ya, mereka biasa dipanggil begitu, tapi maksud saya di sini adalah untuk mengatakan apa yang disebut hal-hal itu / bagaimana mereka diwakili dalam API-ese.
Nathan Reed

1
@NathanReed: MRT tidak digunakan dalam spesifikasi OpenGL, tetapi "permintaan oklusi" sangat banyak. Istilah "sampel lulus" hanyalah satu jenis permintaan oklusi; ada juga "sampel yang lulus" dan "sampel konservatif yang lulus".
Nicol Bolas

28

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.


Bagus, ini pekerjaan hebat!
usap

Saya pikir akan adil untuk mengatakan itu VkDescriptorPooldan ID3D12DescriptorHeapfungsinya 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 dengan VkBufferViewdiketik buffer, seperti halnya untuk D3D11.
Nicol Bolas

Anda tepat di tumpukan deskriptor. Diperbarui. Mengenai tampilan buffer, kedua API memiliki konsep tampilan. Saya tidak tahu apakah DX12 telah terlepas dari konvensi DX1 dari buffer yang diketik atau tidak karena saya tidak memiliki banyak pengalaman dengan DX11.
codingforlove

Bisakah Anda mengatakan bahwa target render D3D12 setara dengan VkFramebuffer?
Jorge Rodriguez

2
Terinspirasi oleh topik ini, saya menulis implementasi header tunggal untuk rendering Vulkan dan DX12: renderers: github.com/chaoticbob/tinyrenderers
codingforlove
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.
Judi bola