C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 26. Direct3D Compute Shader

GameChoi 2023. 6. 21. 19:11

1. Direct3D Compute Shader

1.1 Compute Shader

1.1.1 Compute Shader

 - GPU는 하나의 장소 & 연속된 장소들에 대량의 메모리를 읽어서 처리하는 작업에 최적화

   - 임의 메모리 접근을 염두에 두고 설계된 CPU와 대조적인 특징

   - 정점들과 픽셀들이 개별적으로 처리된다는 특징 때문에 GPU는 대규모 벙렬 처리에 맞게 설계

 - Compute Shader는 Direct3D가 저공하는 프로그램 기능 셰이더

   - 렌더링 파이프라인에 직접 포함되어 있는 것이 아닌 옆에 존재, GPU 자원에서 직접 자료를 읽거나 기록 가능

1.1.2 Thread & Thread Group

 - GPU 프로그래밍에서 작업을 실행할 다수의 스레드들이 스레드 그룹들로 묶여 일종의 격자를 형성

   - 하나의 스레드 그룹은 하나의 다중처리기에서 실행, 각 스레드 그룹 마다 공유 메모리를 가짐

     - 하나의 스레드 그룹은 여러 개의 스레드들로 이루어짐

 - 밑의 코드를 통해 Direct3D 스레드 그룹을 실행할 수 있음

void ID3D11DeviceContext::Dispatch;

1.1.3 Compute Shader Program

 - 크기가 같은 두 Texture의 합을 구하는 계산 셰이더

   - CPU 데이터로 부터 전달된 두 Texture의 Vector를 입력 자원, 두 Texture의 합을 구하고 출력하는 출력 자원 생성

StructuredBuffer<Data> gInputA; StructuredBuffer<Data> gInputB;
RWStructuredBuffer<Data> gOutput;

   - 스레드 그룹 하나의 스레드 개수와 구성

[numthreads(32, 1, 1)]
void CS(int3 dtid : SV_DispatchThreadID)
{
	gOutput[dtid.x].v1 = gInputA[dtid.x].v1 + gInputB[dtid.x].v1;
	gOutput[dtid.x].v2 = gInputA[dtid.x].v2 + gInputB[dtid.x].v2;
}