공부/Graphics, DirectX, 포트폴리오 구조

상수 버퍼, 구조화 버퍼, D3D11_BUFFER_DESC

sudo 2022. 9. 27. 18:52

상수 버퍼 : CPU에서 write해서 GPU로 보내주면 GPU에서는 Read만 가능

구조화 버퍼 : CPU에서 접근 가능 여부를 설정해줄 수 있으며, 이에 따라 바인딩해줘야 하는 자원 뷰(Resource View)가 다르다. 사용자 정의 구조체로 구성할 수 있으며, 대용량 버퍼를 셰이더로 넘겨줘야 할 때 적합

 

D3D11_USAGE enumeration

  설명
D3D11_USAGE_DEFAULT GPU Read & Write -> RWStructuredBuffer에 사용
D3D11_USAGE_IMMUTABLE Only GPU Read(CPU Access, GPU Write 불가)
D3D11_USAGE_DYNAMIC CPU Write, GPU Read만 가능 -> 상수 버퍼와 StructuredBuffer에 사용
D3D11_USAGE_STAGING GPU에서 CPU로 복사가 필요할 때 (ex. 계산 셰이더에서 스키닝 연산하고 그 결과를 CPU로 넘겨줘야 할 때)

 

Buffer 별 D3D11_BUFFER_DESC 멤버 설정

  특징 USAGE
Constant Buffer CPU Only Write/GPU Only Read D3D11_USAGE_DYNAMIC
StructuredBuffer CPU Only Write/GPU Only Read D3D11_USAGE_DYNAMIC
RWStructuredBuffer GPU Read/Write만 가능 CPU는 접근 불가
-> 그래서 Usage가 DEFAULT
D3D11_USAGE_DEFAULT
  BindFlag CPUAccessFlag
Constant Buffer D3D11_BIND_CONSTANT_BUFFER D3D11_CPU_ACCESS_WRITE
StructuredBuffer D3D11_BIND_SHADER_RESOURCE D3D11_CPU_ACCESS_WRITE
RWStructuredBuffer D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS X

 

쓰고보니 Constant Buffer랑 StructuredBuffer(RW말고)를 비교해보면, StructredBuffer는 추가적으로 Shader Resource View를 바인딩해줘야 하는 것을 제외하고는 매우 유사해보인다. 두개 차이가 뭘까?

https://stackoverflow.com/questions/67814169/what-is-the-difference-between-a-constant-buffer-and-a-read-only-structured-buff
https://www.gamedev.net/forums/topic/624529-structured-buffers-vs-constant-buffers/

두 곳 모두에서 언급하는 것은 우선 한번에 접근할 수 있는 메모리 최대 크기가 상수 버퍼는 적고 구조화 버퍼는 매우 크다. 하지만 속도는 상수 버퍼가 더 빠르다. 그래서 대규모 데이터를 넘겨야할 때는 구조화 버퍼를 사용하고 그게 아니라 제한된 크기 안에 해결 가능하면 상수 버퍼를 사용하면 될 것으로 보인다.

 

 

Reference

https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_usage

 

D3D11_USAGE (d3d11.h) - Win32 apps

Identifies expected resource use during rendering. The usage directly reflects whether a resource is accessible by the CPU and/or the graphics processing unit (GPU).

learn.microsoft.com