DirectX / OpenGL (Vulkan) kavram haritalama şeması


32

Genellikle benzer bir donanım özelliği, farklı terimler kullanılarak DirectX ve OpenGL ile gösterilir.

Örneğin:
Sabit Tampon / Tekdüzen Tampon Nesnesi
RWBuffer / SSBO

Hangi OpenX kavramına atıfta bulunmak için hangi DirectX terminolojisinin kullanıldığını açıklayan ayrıntılı bir tablo arıyorum ve bunun tersi de geçerlidir.
Böyle bir kaynağı nerede bulabilirim?


Yorumlar genişletilmiş tartışmalar için değildir; bu konuşma sohbete taşındı .
trichoplax

Yanıtlar:


55

Web'de böyle bir grafik bulamadım, bu yüzden burada bir tane yaptım. (Herkes, herhangi bir hatayı eklemekten, ayrıntılandırmaktan veya düzeltmekten çekinmeyin. Bunlardan bazıları API ve donanım içindekilerin kısmi anlayışına dayanan en iyi tahminlerdir.)

API Temelleri

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 ve Çizim

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

Tamponlar ve Dokular

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)

Hedef Oluşturma

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

Sorguları

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

Hesap Gölgelendiricileri

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

Diğer kaynaklar


3
Vay. Muhtemelen aynı şeyler için en belirgin isimleri oluşturmak için dünyadaki en zor beyinleri işe alıyorlar.
nartheks

Bu çizelge harika, yazmak için zaman ayırdığınız için teşekkürler!
çalışması devam ediyor

3
" texture array - katmanlı görüntü " OpenGL ayrıca onları Dizi Dokular olarak da çağırır; "katmanlı görüntü" terimi öncelikle FBO'lardaki ekleri çevresinde kullanılır. Ayrıca, muhtemelen OpenGL örnekleyici nesnelerinden ve D3D'ye eşdeğer örnekleyici durumundan bahsetmelisiniz.
Nicol Bolas,

2
@ CpCd0y Evet, konuşmaya buna çağrılıyorlar, ancak buradaki amacım bu şeylerin ne dendiğini / API-ese'de nasıl temsil edildiklerini söylemek oldu.
Nathan Reed

1
@NathanReed: MRT OpenGL belirtiminde kullanılmaz, ancak "tıkanma sorgusu" çok fazladır. "Örnekler geçildi" terimi sadece bir tür oklüzyon sorgusu; "herhangi bir numune geçti" ve "koruyucu herhangi bir numune geçti" de vardır.
Nicol Bolas,

28

İş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.


Güzel, bu harika bir iş!
çalışması devam ediyor

Bunu açıklamanın adil olacağını VkDescriptorPoolve ID3D12DescriptorHeapişlevsellik açısından benzer olduğunu (açıklayıcıları nasıl tahsis ettiğiniz şeklinde olduklarını), ancak tanımlayıcıların API'ler arasındaki genel yoldaki farklılıklar nedeniyle oldukça farklı olduğunu düşünüyorum. Ayrıca, D3D12'nin eşdeğerinin VkBufferView, tıpkı D3D11 için olduğu gibi, yazılan tamponlar olduğunu hayal ediyorum.
Nicol Bolas,

Açıklayıcı yığınında haklısın. Güncellenmiş. Tampon görünümleriyle ilgili olarak, her iki API de bir görüş kavramına sahiptir. DX12’nin DX1’de yazılı arabellek kurallarından koptuğunu veya yapamayacağımı söyleyemedim, çünkü DX11’de fazla bir deneyimim olmadı.
Aralık'ta

D3D12 render hedeflerinin VkFramebuffer'in eşdeğeri olduğunu söyleyebilir misiniz?
Jorge Rodriguez

2
Bu konudan ilham alarak, hem Vulkan hem de DX12 işlemcileri için üstbilgi uygulamaları yazdım: renderers: github.com/chaoticbob/tinyrenderers
kodlama için
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.