Biểu đồ ánh xạ các khái niệm DirectX / OpenGL (Vulkan)


32

Thông thường một tính năng phần cứng tương tự được thể hiện thông qua DirectX và OpenGL bằng các thuật ngữ khác nhau.

Ví dụ:
Bộ đệm liên tục / Đối tượng bộ đệm thống nhất
RWBuffer / SSBO

Tôi đang tìm một biểu đồ đầy đủ mô tả thuật ngữ DirectX nào được sử dụng để chỉ khái niệm OpenGL và ngược lại.
Tôi có thể tìm thấy một nguồn tài nguyên như vậy ở đâu?


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
trichoplax

Câu trả lời:


55

Tôi chưa thể tìm thấy một biểu đồ như vậy trên web, vì vậy tôi đã tạo một biểu đồ ở đây. (Mọi người, vui lòng thêm, giải thích hoặc sửa chữa bất kỳ lỗi nào. Một số trong số này chỉ là những phỏng đoán tốt nhất dựa trên sự hiểu biết một phần về API và phần cứng bên trong.)

Khái niệm cơ bản về 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)

Hình học và Vẽ

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

Bộ đệm và kết cấu

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)

Kết xuất mục tiêu

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

Truy vấn

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

Tính toán 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

Các nguồn lực khác


3
Ồ Họ có thể thuê những bộ óc cứng rắn nhất trên thế giới để tạo nên những cái tên khác biệt nhất cho những thứ tương tự.
narthex

Biểu đồ đó thật tuyệt, cảm ơn vì đã dành thời gian để viết nó ra!
lau

3
" mảng kết cấu - hình ảnh lớp " OpenGL cũng gọi chúng là Kết cấu mảng; thuật ngữ "hình ảnh lớp" được sử dụng chủ yếu xung quanh các tệp đính kèm của chúng trong FBO. Ngoài ra, có lẽ bạn nên đề cập đến các đối tượng lấy mẫu OpenGL và trạng thái lấy mẫu tương đương D3D của chúng.
Nicol Bolas

2
@ CpCd0y Vâng, họ thường được gọi như vậy, nhưng ý định của tôi ở đây là nói những thứ đó được gọi là gì / chúng được thể hiện như thế nào trong API-ese.
Nathan Reed

1
@NathanReed: MRT không được sử dụng trong đặc tả OpenGL, nhưng "truy vấn tắc" rất nhiều. Thuật ngữ "các mẫu được thông qua" chỉ là một loại truy vấn tắc; cũng có "bất kỳ mẫu nào được thông qua" và "bảo thủ bất kỳ mẫu nào được thông qua".
Nicol Bolas

28

Đâ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.


Đẹp, đây là một công việc tuyệt vời!
lau

Tôi nghĩ sẽ công bằng khi nói điều đó VkDescriptorPoolID3D12DescriptorHeapcó chức năng tương tự nhau (ở chỗ chúng là cách bạn phân bổ các mô tả), nhưng khác về hình thức, do sự khác biệt trong cách mô tả chung được xử lý giữa các API. Ngoài ra, tôi tưởng tượng rằng D3D12 tương đương với VkBufferViewbộ đệm được gõ, giống như đối với D3D11.
Nicol Bolas

Bạn đang đúng trên đống mô tả. Cập nhật. Về chế độ xem bộ đệm, cả hai API đều có khái niệm về chế độ xem. Tôi không thể biết liệu DX12 có thoát khỏi quy ước DX1 về bộ đệm đã gõ hay không vì tôi không có nhiều kinh nghiệm với DX11.
mã hóa cho

Bạn có thể nói rằng các mục tiêu kết xuất D3D12 tương đương với VkFramebuffer không?
Jorge Rodriguez

2
Lấy cảm hứng từ chủ đề này, tôi đã viết các triển khai tiêu đề duy nhất của cả trình kết xuất Vulkan và DX12: trình kết xuất: github.com/chaoticbob/tinyrenderers
mã hóa cho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.