通常,使用不同的术语通过DirectX和OpenGL公开类似的硬件功能。

例如:常量缓冲区/统一缓冲区对象RWBuffer / SSBO

我正在寻找一个详尽的图表,描述使用哪种DirectX术语来引用哪个OpenGL概念,反之亦然。 -versa。
我在哪里可以找到这样的资源?

评论

评论不作进一步讨论;此对话已移至聊天。

#1 楼

我无法在网上找到这样的图表,因此我在这里做了一个。 (每个人都可以随意添加,阐述或纠正任何错误。其中一些只是基于对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
 


着色器

 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
 


查询

 -override“> 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
 


其他资源



从DirectX11到OpenGL 4.2的移植-并非详尽无遗,而是对以下内容的快速讨论常见的移植问题

MSDN:GLSL到HLSL移植指南–列出了GLSL和HLSL着色语言之间的对应关系和区别


评论


$ \ begingroup $
哇。他们可能聘请世界上最坚强的头脑来为同一事物做出最独特的名字。
$ \ endgroup $
–narthex
16-12-28 21:10



$ \ begingroup $
这张图表很棒,感谢您抽出宝贵的时间写下来!
$ \ endgroup $
– wip
16年12月28日在21:45

$ \ begingroup $
“纹理阵列-分层图像” OpenGL也称它们为“阵列纹理”;术语“分层图像”主要用于FBO中的附件。另外,您可能应该提到OpenGL采样器对象及其等效的D3D采样器状态。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
16 Dec 28 '23:21

$ \ begingroup $
@ CpCd0y是的,他们通俗地称呼它,但是我的目的是说这些东西是什么/它们如何用API-ese表示。
$ \ endgroup $
–内森·里德(Nathan Reed)
16 Dec 30 '22:02

$ \ begingroup $
@NathanReed:OpenGL规范中未使用MRT,但是非常使用“遮挡查询”。术语“通过的样本”仅是一种遮挡查询;还有“通过的所有样本”和“保守的通过的所有样本”。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
16年12月31日在3:26

#2 楼

这是Vulkan和DirectX 12的非详尽列表,使用与Nathan相似的标准将它们拼凑在一起。着色器阶段之类的东西在DX11和OpenGL中保持不变。显然,DirectX使用视图使着色器可见。 Vulkan也使用视图,但是它们不那么频繁。

着色器的可见性行为在两者之间有所不同。 Vulkan使用遮罩确定描述符在各个着色器阶段是否可见。 DX12的处理方式略有不同,资源可见性是在单个阶段还是在所有阶段完成。

我尽可能地分解了​​描述符集/根参数。描述符处理是两个API之间差异很大的领域之一。但是,最终结果却非常相似。

API基础知识

vulkan的WSI层为交换链提供图像。 DX12需要创建资源来表示图像。

两者之间的常规队列行为非常相似。从多个线程提交时有一些特质。

在我记得更多的东西的情况下,将尝试更新... Vulkan / DX12文档中有关命令池/分配器的内容用非常不同的词表示了行为-但实际行为非常相似。用户可以自由地从池中分配许多命令缓冲区/列表。但是,池中只能记录一个命令缓冲区/列表。池不能在线程之间共享。因此,多个线程需要多个池。您还可以在提交命令缓冲区/列表后,立即开始记录。

DX12命令列表以打开状态创建。我觉得这很烦人,因为我已经习惯了Vulkan。 DX12还要求并明确重置命令分配器和命令列表。这是Vulkan中的可选行为。

描述符

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


** RootParameter-不完全等同于VkDescriptorSetLayoutBinding,但在更大的范围内具有类似的想法。管理描述符本身的分配。

应注意,DX12在任何给定时间最多仅支持两个绑定到命令列表的描述符堆。一台CBVSRVUAV和一台采样器。您可以具有要引用这些堆的任意多个描述符表。

在Vulkan方面,您告诉描述符池的最大描述符集数量有一个硬性限制。在这两种方法上,您都必须对池/堆可以具有的每种类型的描述符数量进行一些手动记帐。 Vulkan的描述符类型也更加明确。而在DX12上,描述符是CBVSRVUAV或采样器。

DX12还具有一项功能,您可以使用SetGraphicsRootConstantBufferView即时绑定CBV。但是,SRV版本的SetGraphicsRootShaderResourceView在纹理上不起作用。它在文档中-但如果您不是一位细心的读者,可能还要花几个小时才能弄清。

管道

br /> * ** RootSignature-不完全等同于VkPipelineLayout。

DX12将顶点属性和绑定合并到单个描述中。

图像和缓冲区

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


这两个API的屏障分解有些不同,但最终结果相似。

/> RenderPasses / RenderTargets

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


Vulkan渲染过程具有很好的自动解析功能。 DX12没有此AFIAK。两种API均提供用于手动解析的功能。

VkFramebuffer与DX12中的任何对象之间没有直接的等效关系。映射到RTV的ID3D12Resource的集合是一个宽松的相似之处。

VkFramebuffer或多或少类似于VkRenderPass使用索引引用的附件池。 VkRenderPass内的子通道可以引用VkFramebuffer中的任何附件,前提是每个子通道不对同一附件进行多次引用。一次使用的颜色附件的最大数量限制为VkPhysicalDeviceLimits.maxColorAttachments。

DX12的渲染目标只是由ID3D12Resource对象支持的RTV。一次使用的颜色附件的最大数量限制为D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT(8)。这两个API都要求您在创建管道对象时指定渲染目标/通道。但是,Vulkan允许您使用兼容的渲染通道,因此您不会被锁定在管线创建期间指定的渲染通道。我还没有在DX12上测试过它,但是我猜是因为它只是一个RTV,所以在DX12上也是如此。

评论


$ \ begingroup $
很好,这是很棒的工作!
$ \ endgroup $
– wip
16-12-29在11:06

$ \ begingroup $
我认为应该说VkDescriptorPool和ID3D12DescriptorHeap在功能上是相似的(因为它们是您分配描述符的方式),但是在形式上却完全不同,这是因为在蜜蜂。另外,我想像D3D11一样,等效于VkBufferView的D3D12是类型化缓冲区。
$ \ endgroup $
–尼科尔·波拉斯(Nicol Bolas)
16年12月29日在16:24

$ \ begingroup $
您就在描述符堆上了。更新。关于缓冲区视图,两个API都有一个视图概念。由于我对DX11的经验不足,因此我无法确定DX12是否违反了DX1的类型缓冲区约定。
$ \ endgroup $
–codingforlove
16-12-29在16:37

$ \ begingroup $
您能说D3D12渲染目标等同于VkFramebuffer吗?
$ \ endgroup $
–乔治·罗德里格斯(Jorge Rodriguez)
16 Dec 30'6:03

$ \ begingroup $
受这个主题的启发,我写了Vulkan和DX12渲染器的单头实现:renderers:github.com/chaoticbob/tinyrenderers
$ \ endgroup $
–codingforlove
17年1月9日,11:23