例如:常量缓冲区/统一缓冲区对象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
pre >
缓冲区和纹理
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
评论
评论不作进一步讨论;此对话已移至聊天。