Đây là danh sách không đầy đủ của Vulkan và DirectX 12. Điều này được ghép lại với nhau bằng các tiêu chí tương tự như của tiêu chí của Nathan.
Nhìn chung, cả hai API đều giống nhau một cách đáng ngạc nhiên. Những thứ như các giai đoạn đổ bóng vẫn không thay đổi so với DX11 và OpenGL. Và rõ ràng, DirectX sử dụng các khung nhìn để làm cho mọi thứ hiển thị với các shader. Vulkan cũng sử dụng các khung nhìn, nhưng chúng ít thường xuyên hơn.
Hành vi hiển thị của Shader khác nhau một chút giữa hai. Vulkan sử dụng mặt nạ để xác định xem mô tả có thể nhìn thấy các giai đoạn đổ bóng khác nhau hay không. DX12 xử lý vấn đề này một chút khác biệt, khả năng hiển thị tài nguyên được thực hiện trên một giai đoạn hoặc tất cả các giai đoạn.
Tôi đã phá vỡ bộ mô tả / công cụ tham số gốc xuống tốt nhất có thể. Xử lý mô tả là một trong những lĩnh vực khác nhau rất nhiều giữa hai API. Tuy nhiên, kết quả cuối cùng khá giống nhau.
Khái niệm cơ bản về 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
Lớp WSI của Vulkan cung cấp hình ảnh cho hoán đổi. DX12 yêu cầu tài nguyên sáng tạo để đại diện cho hình ảnh.
Hành vi xếp hàng chung là khá giống nhau giữa cả hai. Có một chút bình dị khi gửi từ nhiều chủ đề.
Sẽ cố gắng cập nhật khi tôi nhớ nhiều thứ hơn ...
Bộ đệm lệnh và Bi-a
Vulkan DirectX 12
--------------- ---------------
VkCommandPool ID3D12CommandAllocator
VkCommandBuffer ID3D12CommandList/ID3D12GraphicsCommandList
Verbiage về nhóm lệnh / cấp phát từ các tài liệu Vulkan / DX12 nêu hành vi bằng các từ rất khác nhau - nhưng hành vi thực tế khá giống nhau. Người dùng có thể tự do phân bổ nhiều bộ đệm lệnh / danh sách từ nhóm. Tuy nhiên, chỉ có một bộ đệm lệnh / danh sách từ nhóm có thể được ghi. Hồ bơi không thể được chia sẻ giữa các chủ đề. Vì vậy, nhiều chủ đề yêu cầu nhiều nhóm. Bạn cũng có thể bắt đầu ghi ngay lập tức sau khi gửi bộ đệm / danh sách lệnh trên cả hai.
Danh sách lệnh DX12 được tạo ở trạng thái mở. Tôi thấy điều này hơi khó chịu vì tôi đã quen với Vulkan. DX12 cũng yêu cầu và thiết lập lại rõ ràng của cấp phát lệnh và danh sách lệnh. Đây là một hành vi tùy chọn trong Vulkan.
Mô tả
Vulkan DirectX 12
--------------- ---------------
VkDescriptorPool n/a
VkDescriptorSet n/a
VkDescriptorSetLayout n/a
VkDescriptorSetLayoutBinding RootParameter**
n/a ID3D12DescriptorHeap
** RootParameter - không chính xác tương đương với VkDescriptorSetLayoutBinding nhưng suy nghĩ tương tự trong bức tranh lớn hơn.
VkDescriptorPool và ID3D12DescriptorHeaps giống nhau (cảm ơn Nicolas) ở chỗ cả hai đều tự quản lý việc phân bổ các mô tả.
Cần lưu ý rằng DX12 chỉ hỗ trợ tối đa hai đống mô tả liên kết với một danh sách lệnh tại bất kỳ thời điểm nào. Một CBVSRVUAV và một bộ lấy mẫu. Bạn có thể có nhiều bảng mô tả như bạn muốn tham khảo các đống này.
Về phía Vulkan, có một giới hạn cứng đối với số lượng bộ mô tả tối đa mà bạn nói với nhóm mô tả. Trên cả hai bạn phải thực hiện một chút kế toán thủ công về số lượng mô tả cho mỗi loại nhóm / heap có thể có. Vulkan cũng rõ ràng hơn với các loại mô tả. Trong khi đó trên các mô tả DX12 là CBVSRVUAV hoặc bộ lấy mẫu.
DX12 cũng có một tính năng trong đó bạn có thể sắp xếp một CBV đang hoạt động bằng cách sử dụng SetGraphicsRootConstantBufferView. Tuy nhiên, phiên bản SRV của cái này, SetGraphicsRootShaderResourceView, không hoạt động trên kết cấu. Nó có trong tài liệu - nhưng cũng có thể khiến bạn mất vài giờ để tìm hiểu điều này nếu bạn không phải là người đọc cẩn thận.
Đường ống
Vulkan DirectX 12
--------------- ---------------
VkPipelineLayout RootSignature***
VkPipeline ID3D12PipelineState
VkVertexInputAttributeDescription D3D12_INPUT_ELEMENT_DESC
VkVertexInputBindingDescription "
* ** RootSignature - không chính xác tương đương với VkPipelineLayout .
DX12 kết hợp thuộc tính đỉnh và liên kết thành một mô tả duy nhất.
Hình ảnh và bộ đệm
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
Rào cản trên cả hai API phá vỡ một chút khác nhau, nhưng có kết quả ròng tương tự nhau.
RenderPasses / RenderTarget
Vulkan DirectX 12
--------------- ---------------
VkRenderPass render pass
VkFramebuffer collection of ID3D12Resource
subpass n/a
n/a render target
Vượt qua Vulkan có một tính năng tự động giải quyết tốt đẹp. DX12 không có AFIAK này. Cả hai API đều cung cấp các chức năng để giải quyết thủ công.
Không có sự tương đương trực tiếp giữa VkFramebuffer và bất kỳ đối tượng nào trong DX12. Một bộ sưu tập ID3D12 Nguồn cung cấp ánh xạ tới RTV là một sự tương đồng lỏng lẻo.
VkFramebuffer hoạt động ít nhiều giống như một nhóm đính kèm mà VkRenderPass tham chiếu bằng cách sử dụng một chỉ mục. Các đường dẫn trong VkRenderPass có thể tham chiếu bất kỳ tệp đính kèm nào trong VkFramebuffer giả sử rằng tệp đính kèm tương tự không được tham chiếu nhiều hơn một lần cho mỗi đường dẫn. Số lượng tệp đính kèm tối đa được sử dụng cùng một lúc được giới hạn ở VkPhysicalDeviceLimits.maxColorAttachments.
Các mục tiêu kết xuất của DX12 chỉ là các RTV được hỗ trợ bởi các đối tượng ID3D12Resource. Số lượng tệp đính kèm tối đa được sử dụng cùng một lúc được giới hạn ở D3D12_SIMULTaneOUS_RENDER_TARGET_COUNT (8).
Cả hai API đều yêu cầu bạn chỉ định các mục tiêu / đường truyền kết xuất khi tạo các đối tượng đường ống. Tuy nhiên, Vulkan cho phép bạn sử dụng các đường truyền kết xuất tương thích, do đó bạn không bị khóa trong những đường dẫn bạn chỉ định trong quá trình tạo đường ống. Tôi chưa thử nó trên DX12, nhưng tôi đoán vì đó chỉ là RTV, điều này cũng đúng trên DX12.