DirectX가 제공하는 프로그램 가능 쉐이더의 하나로 랜더링 파이프라인에 포함되지 않는다.
GPU자원의 자료를 직접 읽고 쓰기가 가능하다.
렌더링을 위한 쉐이더가 아닌 계산을 위한 쉐이더로 GPGPU프로그래밍을 할 때 주로 사용된다.
커널, 스레드, 그룹으로 이루어져 있다.
커널
쓰레드
그룹
//Shader 코드
RWTexture2D<float4> g_rwtex_0 : register(u0);
// 쓰레드 그룹당 쓰레드 개수
// max : 1024 (CS_5.0)
// - 하나의 쓰레드 그룹은 하나의 다중처리기에서 실행
[numthreads(1024, 1, 1)]
void CS_Main(int3 threadIndex : SV_DispatchThreadID)
{
if (threadIndex.y % 2 == 0)
g_rwtex_0[threadIndex.xy] = float4(1.f, 0.f, 0.f, 1.f);
else
g_rwtex_0[threadIndex.xy] = float4(0.f, 1.f, 0.f, 1.f);
}
#pragma region ComputeShader
{
shared_ptr<Shader> shader = GET_SINGLE(Resources)->Get<Shader>(L"ComputeShader");
// UAV 용 Texture 생성
shared_ptr<Texture> texture = GET_SINGLE(Resources)->CreateTexture(L"UAVTexture",
DXGI_FORMAT_R8G8B8A8_UNORM, 1024, 1024,
CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), D3D12_HEAP_FLAG_NONE,
D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
shared_ptr<Material> material = GET_SINGLE(Resources)->Get<Material>(L"ComputeShader");
material->SetShader(shader);
material->SetInt(0, 1);
GEngine->GetComputeDescHeap()->SetUAV(texture->GetUAVHandle(), UAV_REGISTER::u0);
// 쓰레드 그룹 (1 * 1024 * 1)
material->Dispatch(1, 1024, 1);
}
#pragma endregion
위 코드에 Dispatch를 통해 1 x 1024 x 1 구조의 쓰레드 그룹을 생성한다.
즉, 위의 shader 코드에서 y좌표 기준으로 쓰레드 그룹의 인덱스를 번갈아서 그려주므로써 초록, 빨강이 반복되는 줄무늬가 완성될 것이다.