상수 버퍼 : 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를 바인딩해줘야 하는 것을 제외하고는 매우 유사해보인다. 두개 차이가 뭘까?
두 곳 모두에서 언급하는 것은 우선 한번에 접근할 수 있는 메모리 최대 크기가 상수 버퍼는 적고 구조화 버퍼는 매우 크다. 하지만 속도는 상수 버퍼가 더 빠르다. 그래서 대규모 데이터를 넘겨야할 때는 구조화 버퍼를 사용하고 그게 아니라 제한된 크기 안에 해결 가능하면 상수 버퍼를 사용하면 될 것으로 보인다.
Reference
https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ne-d3d11-d3d11_usage
'공부 > Graphics, DirectX, 포트폴리오 구조' 카테고리의 다른 글
포워드 렌더링(Forward Rendering) vs 디퍼드 렌더링(Deferred Rendering) (0) | 2022.10.11 |
---|---|
계산 셰이더(Compute Shader) (0) | 2022.09.27 |
3D OBB 충돌 코드 및 설명 (0) | 2022.09.22 |
그림자 매핑(Shadow Mapping) (0) | 2022.09.17 |
Lighting (0) | 2022.09.13 |