นี่คือรายการที่ไม่ครบถ้วนสมบูรณ์ของ 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