แผนภูมิการแมปแนวคิด DirectX / OpenGL (Vulkan)


32

บ่อยครั้งที่คุณสมบัติฮาร์ดแวร์ที่คล้ายกันถูกเปิดเผยผ่าน DirectX และ OpenGL โดยใช้คำศัพท์ที่แตกต่างกัน

ตัวอย่างเช่น:
Constant Buffer / Uniform Buffer Object
RWBuffer / SSBO

ฉันกำลังมองหาแผนภูมิครบถ้วนสมบูรณ์ที่อธิบายคำศัพท์ DirectX ที่ใช้เพื่ออ้างถึงแนวคิด OpenGL ใดและในทางกลับกัน
ฉันจะหาทรัพยากรได้จากที่ไหน?


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
trichoplax

คำตอบ:


55

ฉันไม่สามารถหาแผนภูมิดังกล่าวบนเว็บดังนั้นฉันทำที่นี่ (ทุกคนรู้สึกอิสระที่จะเพิ่มอธิบายเพิ่มเติมหรือแก้ไขข้อผิดพลาดใด ๆ เหล่านี้เป็นเพียงการคาดเดาที่ดีที่สุดตามความเข้าใจบางส่วนของ API และการใช้ฮาร์ดแวร์ภายใน)

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

shaders

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)

เรขาคณิตและการวาด

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

บัฟเฟอร์และพื้นผิว

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)

แสดงผลเป้าหมาย

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

แบบสอบถาม

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

คำนวณเฉดสี

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

ทรัพยากรอื่น ๆ


3
ว้าว. พวกเขาอาจจ้างจิตใจที่ทรหดที่สุดในโลกเพื่อสร้างชื่อที่ชัดเจนที่สุดสำหรับสิ่งเดียวกัน
narthex

แผนภูมินั้นดีมากขอบคุณที่สละเวลาเขียนมันลงไป!
เช็ด

3
" array texture - image layered " OpenGL เรียกพวกเขาว่า Array Textures คำว่า "ภาพซ้อนทับ" ถูกนำมาใช้เป็นหลักรอบสิ่งที่แนบมาของพวกเขาใน FBOs นอกจากนี้คุณควรพูดถึงวัตถุตัวอย่างของ OpenGL และสถานะของตัวอย่างของ D3D ที่เทียบเท่ากัน
Nicol Bolas

2
@ CpCd0y ใช่พวกเขาเรียกขานกันว่า แต่ความตั้งใจของฉันที่นี่คือการพูดในสิ่งที่เรียกว่า / สิ่งที่พวกเขาเป็นตัวแทนใน API-ese
Nathan Reed

1
@NathanReed: MRT ไม่ได้ใช้ในข้อกำหนดของ OpenGL แต่ "เคียวรีการบดเคี้ยว" เป็นอย่างมาก คำว่า "ตัวอย่างที่ผ่าน" เป็นเพียงหนึ่งในแบบสอบถามแบบการบดเคี้ยว นอกจากนี้ยังมี "ตัวอย่างใด ๆ ผ่าน" และ "อนุรักษ์ตัวอย่างใด ๆ ผ่าน"
Nicol Bolas

28

นี่คือรายการที่ไม่ครบถ้วนสมบูรณ์ของ Vulkan และ DirectX 12 ซึ่งมีการผสานกันโดยใช้เกณฑ์ที่คล้ายกับของนาธาน

โดยรวม API ทั้งสองมีความคล้ายคลึงกันอย่างน่าประหลาดใจ สิ่งต่าง ๆ เช่นระดับเชดเดอร์ยังคงไม่เปลี่ยนแปลงจาก DX11 และ OpenGL และเห็นได้ชัดว่า DirectX ใช้มุมมองเพื่อทำให้มองเห็นสิ่งที่แตกต่าง Vulkan ยังใช้มุมมอง แต่ก็ไม่ค่อยบ่อยนัก

พฤติกรรมการมองเห็น Shader แตกต่างกันเล็กน้อยระหว่างสอง Vulkan ใช้มาสก์เพื่อกำหนดว่า descriptor สามารถมองเห็นได้ในแต่ละช่วงของ shader หรือไม่ DX12 จัดการสิ่งนี้แตกต่างกันเล็กน้อยการมองเห็นทรัพยากรสามารถทำได้ทั้งในขั้นตอนเดียวหรือทุกขั้นตอน

ฉันทำลายชุดพารามิเตอร์ / พารามิเตอร์ descriptor ลงอย่างดีที่สุดเท่าที่จะทำได้ การจัดการ Descriptor เป็นหนึ่งในพื้นที่ที่แตกต่างกันอย่างมากระหว่างสอง APIs อย่างไรก็ตามผลลัพธ์ที่ได้ค่อนข้างใกล้เคียงกัน

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

เลเยอร์ WSI ของ Vulkan ส่งภาพสำหรับ swapchain DX12 ต้องการทรัพยากรการสร้างเพื่อแสดงรูปภาพ

พฤติกรรมคิวทั่วไปค่อนข้างคล้ายกันระหว่างทั้งสอง มีความงี่เง่าเล็กน้อยเมื่อส่งจากหลายเธรด

จะพยายามอัปเดตเมื่อฉันจำสิ่งต่างๆเพิ่มเติม ...

Command Buffer and Pool

Vulkan                              DirectX 12
---------------                     ---------------
VkCommandPool                       ID3D12CommandAllocator
VkCommandBuffer                     ID3D12CommandList/ID3D12GraphicsCommandList

การใช้คำฟุ่มเฟือยเกี่ยวกับพูลคำสั่ง / ตัวจัดสรรจาก Vulkan / DX12 docs ระบุพฤติกรรมในคำที่แตกต่างกันมาก - แต่พฤติกรรมที่แท้จริงคล้ายกันมาก ผู้ใช้มีอิสระในการจัดสรรบัฟเฟอร์ / รายการคำสั่งจำนวนมากจากกลุ่ม อย่างไรก็ตามสามารถบันทึกบัฟเฟอร์คำสั่ง / รายการเดียวจากพูลได้ พูลไม่สามารถแบ่งใช้ระหว่างเธรด ดังนั้นหลายเธรดจำเป็นต้องมีหลายพูล คุณยังสามารถเริ่มบันทึกได้ทันทีหลังจากส่งบัฟเฟอร์คำสั่ง / รายการทั้งสอง

รายการคำสั่ง DX12 ถูกสร้างขึ้นในสถานะเปิด ฉันพบว่ามันน่ารำคาญนิดหน่อยตั้งแต่ฉันคุ้นเคยกับ Vulkan DX12 ยังต้องการและตั้งค่าใหม่อย่างชัดเจนของตัวจัดสรรคำสั่งและรายการคำสั่ง นี่เป็นพฤติกรรมที่ไม่จำเป็นใน Vulkan

อธิบาย

Vulkan                              DirectX 12
---------------                     ---------------
VkDescriptorPool                    n/a
VkDescriptorSet                     n/a
VkDescriptorSetLayout               n/a
VkDescriptorSetLayoutBinding        RootParameter**
n/a                                 ID3D12DescriptorHeap

** RootParameter - ไม่เทียบเท่ากับVkDescriptorSetLayoutBindingแต่มีความคิดคล้ายกันในภาพใหญ่ขึ้น

VkDescriptorPool และ ID3D12DescriptorHeaps นั้นคล้ายกัน (ขอบคุณ Nicolas) ซึ่งพวกเขาทั้งสองจัดการการจัดสรรตัวอธิบาย

ควรสังเกตว่า DX12 รองรับฮีปตัวอธิบายสองตัวเท่านั้นที่โยงกับรายการคำสั่งในเวลาที่กำหนด หนึ่ง CBVSRVUAV และหนึ่งตัวอย่าง คุณสามารถมีตารางตัวอธิบายได้มากเท่าที่คุณต้องการอ้างอิงกองเหล่านี้

ที่ด้าน Vulkan มีการ จำกัด จำนวนชุดตัวอธิบายให้มากที่สุดที่คุณบอกพูลตัวอธิบาย ในทั้งสองคุณต้องทำบัญชีด้วยตนเองเล็กน้อยตามจำนวนของตัวอธิบายต่อชนิดที่พูล / ฮีพสามารถมีได้ Vulkan ยังมีความชัดเจนมากขึ้นด้วยประเภทของคำอธิบาย ในขณะที่ตัวอธิบาย DX12 เป็น CBVSRVUAV หรือตัวอย่าง

DX12 ยังมีคุณสมบัติที่คุณสามารถจัดเรียง CBV ได้ทันทีโดยใช้ SetGraphicsRootConstantBufferView อย่างไรก็ตามรุ่น SRV นี้ SetGraphicsRootShaderResourceView ไม่ทำงานบนพื้นผิว มันอยู่ในเอกสาร - แต่อาจใช้เวลาสองสามชั่วโมงกว่าจะคิดออกหากคุณไม่ใช่ผู้อ่านที่ระมัดระวัง

ท่อส่ง

Vulkan                              DirectX 12
---------------                     ---------------
VkPipelineLayout                    RootSignature***
VkPipeline                          ID3D12PipelineState
VkVertexInputAttributeDescription   D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription     "

* ** RootSignature - ไม่แน่นอนเทียบเท่ากับVkPipelineLayout

DX12 รวมคุณลักษณะจุดสุดยอดและผูกเข้ากับคำอธิบายเดียว

รูปภาพและบัฟเฟอร์

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

ปัญหาและอุปสรรคบน API ทั้งสองแตกต่างกันเล็กน้อย แต่มีผลสุทธิที่คล้ายกัน

RenderPasses / RenderTargets

Vulkan                              DirectX 12
---------------                     ---------------
VkRenderPass                        render pass
VkFramebuffer                       collection of ID3D12Resource
subpass                             n/a
n/a                                 render target

Vulkan render pass มีคุณสมบัติการแก้ไขอัตโนมัติที่ดี DX12 ไม่มี AFIAK นี้ API ทั้งสองมีฟังก์ชันสำหรับการแก้ไขด้วยตนเอง

ไม่มีความเท่าเทียมกันโดยตรงระหว่าง VkFramebuffer และวัตถุใด ๆ ใน DX12 คอลเลกชันของ ID3D12 ทรัพยากรที่แมปไปยัง RTV นั้นมีความคล้ายคลึงกันหลวม ๆ

VkFramebuffer ทำหน้าที่คล้ายกับพูลพูลที่ VkRenderPass อ้างอิงโดยใช้ดัชนี Subpasses ภายใน VkRenderPass สามารถอ้างอิงสิ่งที่แนบใด ๆ ใน VkFramebuffer สมมติว่าสิ่งที่แนบมาเหมือนกันไม่ได้อ้างอิงมากกว่าหนึ่งครั้งต่อ subpass จำนวนสูงสุดของสิ่งที่แนบสีที่ใช้ในครั้งเดียวถูก จำกัด ไว้ที่ VkPhysicalDeviceLimits.maxColorAttachments

เป้าหมายการแสดงผลของ DX12 เป็นเพียง RTV ที่ได้รับการสนับสนุนโดยวัตถุ ID3D12Resource จำนวนสูงสุดของไฟล์แนบสีที่ใช้พร้อมกันถูก จำกัด ไว้ที่ D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8)

API ทั้งสองต้องการให้คุณระบุการแสดงผลเป้าหมาย / การส่งที่การสร้างออบเจกต์ไปป์ อย่างไรก็ตาม Vulkan อนุญาตให้คุณใช้การส่งการเรนเดอร์ที่เข้ากันได้ดังนั้นคุณจะไม่ถูกล็อกในสิ่งที่คุณระบุในระหว่างการสร้างไปป์ไลน์ ฉันไม่ได้ทดสอบกับ DX12 แต่ฉันเดาว่ามันเป็นเพียง RTV นี่ก็เป็นจริงใน DX12


เยี่ยมมากนี่เป็นงานที่ยอดเยี่ยม!
wip

ฉันคิดว่ามันยุติธรรมที่จะบอกว่าVkDescriptorPoolและID3D12DescriptorHeapคล้ายกันในฟังก์ชั่น (ในที่พวกเขาเป็นวิธีการจัดสรร descriptors) แต่แตกต่างกันมากในรูปแบบเนื่องจากความแตกต่างในวิธีการจัดการ descriptors โดยรวมระหว่าง API นอกจากนี้ฉันคิดว่า D3D12 เทียบเท่ากับVkBufferViewพิมพ์บัฟเฟอร์เช่นเดียวกับ D3D11
Nicol Bolas

คุณพูดถูกกองฮีป Updated เกี่ยวกับมุมมองบัฟเฟอร์ทั้ง API มีแนวคิดของมุมมอง ฉันไม่สามารถบอกได้ว่า DX12 แตกหักจากการประชุม DX1 ของบัฟเฟอร์ที่พิมพ์หรือไม่เพราะฉันไม่มีประสบการณ์มากกับ DX11
codingforlove

คุณสามารถบอกได้ว่าการแสดงผลเป้าหมายของ D3D12 นั้นเทียบเท่ากับ VkFramebuffer หรือไม่?
Jorge Rodriguez

2
แรงบันดาลใจจากหัวข้อนี้ฉันได้เขียนการใช้งานส่วนหัวเดียวของ Vulkan และ DX12 renderers: renderers: github.com/chaoticbob/tinyrenderers
codingforlove
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.