DirectX / OpenGL (Vulkan) 개념 매핑 차트


32

종종 비슷한 용어를 사용하여 DirectX와 OpenGL을 통해 유사한 하드웨어 기능이 노출됩니다.

예 :
상수 버퍼 / 균일 버퍼 객체
RWBuffer / SSBO

어떤 DirectX 용어를 사용하여 어떤 OpenGL 개념을 참조하고 그 반대인지를 설명하는 철저한 차트를 찾고 있습니다.
그러한 자원을 어디서 찾을 수 있습니까?


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
trichoplax

답변:


55

웹에서 그러한 차트를 찾을 수 없었으므로 여기에서 차트를 만들었습니다. (모든 사람은 실수를 추가하거나 정교하게 수정하거나 수정하십시오.이 중 일부는 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

쿼리

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

기타 자료


3
와우. 그들은 아마도 세상에서 가장 힘든 사람들을 고용하여 같은 것들에 대한 가장 뚜렷한 이름을 구성 할 것입니다.
narthex

그 차트를 적어 주셔서 감사합니다!
wip

3
" texture array-layered image "OpenGL은 또한 그것을 Array Textures라고 부릅니다. "계층화 된 이미지"라는 용어는 주로 FBO에서 첨부 파일 주위에 사용됩니다. 또한 OpenGL 샘플러 객체와 그에 해당하는 D3D 샘플러 상태를 언급해야합니다.
니콜 볼 라스

2
@ CpCd0y 그래, 그들은 구어체 적으로 그것을 부른다. 그러나 나의 의도는 그 것들이 무엇인지 / API로 표현되는 방법을 말하는 것이 었습니다.
Nathan Reed

1
@NathanReed : MRT는 OpenGL 사양에서 사용되지 않지만 "폐색 쿼리"는 매우 많이 사용됩니다. "통과 된 샘플"이라는 용어는 단지 한 종류의 오 클루 전 쿼리입니다. "모든 샘플 통과"및 "보존적인 모든 샘플 통과"도 있습니다.
Nicol Bolas

28

Vulkan 및 DirectX 12의 전체 목록은 다음과 같습니다. 이는 Nathan의 것과 유사한 기준을 사용하여 함께 묶입니다.

전반적으로 두 API는 놀라 울 정도로 비슷합니다. 셰이더 단계와 같은 것은 DX11 및 OpenGL에서 변경되지 않은 상태로 유지됩니다. 그리고 DirectX는 뷰를 사용하여 셰이더가 볼 수 있도록합니다. Vulkan은 뷰를 사용하지만 빈도가 적습니다.

셰이더 가시성 동작은 둘 사이에서 약간 다릅니다. Vulkan은 마스크를 사용하여 설명자가 다양한 셰이더 단계에 표시되는지 확인합니다. DX12는 이것을 조금 다르게 처리하며, 리소스 가시성은 단일 단계 또는 모든 단계에서 수행됩니다.

디스크립터 세트 / 루트 매개 변수를 최대한 손상 시켰습니다. 디스크립터 처리는 두 API간에 크게 다른 영역 중 하나입니다. 그러나 최종 결과는 상당히 비슷합니다.

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

Vulkan의 WSI 계층은 스왑 체인에 이미지를 제공합니다. DX12에는 이미지를 나타 내기위한 생성 리소스가 필요합니다.

일반적인 대기열 동작은 둘 다 매우 비슷합니다. 여러 스레드에서 제출할 때 약간의 특질이 있습니다.

더 많은 것들을 기억하면서 업데이트하려고합니다 ...

명령 버퍼 및 풀

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

Vulkan / DX12 문서의 명령 풀 / 할당 자에 대한 설명은 동작을 매우 다른 단어로 표시하지만 실제 동작은 매우 유사합니다. 사용자는 풀에서 많은 명령 버퍼 / 목록을 자유롭게 할당 할 수 있습니다. 그러나 풀에서 하나의 명령 버퍼 / 목록 만 기록 할 수 있습니다. 스레드간에 풀을 공유 할 수 없습니다. 따라서 여러 스레드에는 여러 풀이 필요합니다. 둘 다 명령 버퍼 / 목록을 제출 한 후 즉시 기록을 시작할 수 있습니다.

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는 주어진 시간에 명령 목록에 바인딩 된 최대 2 개의 디스크립터 힙만 지원합니다. 하나의 CBVSRVUAV와 하나의 샘플러. 이러한 힙을 참조하려는 디스크립터 테이블을 원하는만큼 가질 수 있습니다.

Vulkan 측에는 설명자 풀에 알려주는 최대 설명자 세트 수에 대한 제한이 있습니다. 둘 다에서 풀 / 힙이 가질 수있는 유형 당 설명자 수에 대해 약간의 수동 계산을 수행해야합니다. Vulkan은 또한 디스크립터 유형으로 더 명확합니다. 반면 DX12 디스크립터는 CBVSRVUAV 또는 샘플러입니다.

DX12에는 SetGraphicsRootConstantBufferView를 사용하여 CBV를 즉시 바인딩 할 수있는 기능도 있습니다. 그러나이 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 렌더 패스에는 멋진 자동 해결 기능이 있습니다. DX12에는이 AFIAK이 없습니다. 두 API 모두 수동 해결 기능을 제공합니다.

VkFramebuffer와 DX12의 모든 객체간에 직접적인 동등성은 없습니다. RTV에 맵핑되는 ID3D12Resource 콜렉션은 유사하지 않습니다.

VkFramebuffer는 VkRenderPass가 색인을 사용하여 참조하는 첨부 파일 풀과 거의 비슷하게 작동합니다. VkRenderPass 내의 서브 패스는 동일한 첨부 파일이 서브 패스 당 두 번 이상 참조되지 않는 경우 VkFramebuffer의 첨부 파일을 참조 할 수 있습니다. 한 번에 사용되는 최대 색상 첨부 파일 수는 VkPhysicalDeviceLimits.maxColorAttachments로 제한됩니다.

DX12의 렌더 타겟은 ID3D12Resource 객체로 지원되는 RTV입니다. 한 번에 사용되는 최대 컬러 첨부 파일 수는 D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT (8)로 제한됩니다.

두 API 모두 파이프 라인 객체 생성시 렌더 타겟 / 패스를 지정해야합니다. 그러나 Vulkan을 사용하면 호환 가능한 렌더 패스를 사용할 수 있으므로 pipline 작성 중에 지정한 패스에 고정되지 않습니다. DX12에서 테스트하지는 않았지만 RTV 일 뿐이므로 DX12에서도 마찬가지입니다.


좋아, 이건 대단해!
wip

나는 그 말을 공정하다고 생각 VkDescriptorPool하고 ID3D12DescriptorHeap(그들은 당신이 기술자를 할당하는 방법이다에 있음) 함수에서 유사하지만, 인해 API를 사이에 처리하는 전체 방법 설명의 차이로, 형태 상당히 다른. 또한 D3D11과 동일한 D3D12 VkBufferView가 유형이 지정된 버퍼 라고 생각합니다 .
Nicol Bolas

설명자 힙에 있습니다. 업데이트되었습니다. 버퍼 뷰와 관련하여 두 API에는 뷰 개념이 있습니다. DX11에 대한 경험이 많지 않아 DX12가 형식화 버퍼의 DX1 규칙을 어겼는지 여부를 알 수 없었습니다.
codingforlove

D3D12 렌더 타겟이 VkFramebuffer와 동일하다고 말할 수 있습니까?
Jorge Rodriguez

2
이 주제에서 영감을 받아 Vulkan 및 DX12 렌더러의 단일 헤더 구현을 작성했습니다. 렌더러 : github.com/chaoticbob/tinyrenderers
codingforlove
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.