Compute Shader

이승덱·2021년 8월 13일
0

Graphics&DirectX

목록 보기
30/37

Compute Shader

  • DirectX가 제공하는 프로그램 가능 쉐이더의 하나로 랜더링 파이프라인에 포함되지 않는다.

  • GPU자원의 자료를 직접 읽고 쓰기가 가능하다.

  • 렌더링을 위한 쉐이더가 아닌 계산을 위한 쉐이더로 GPGPU프로그래밍을 할 때 주로 사용된다.

  • 커널, 스레드, 그룹으로 이루어져 있다.

  • 커널

    • Kernel은 GPU에서 처리하는 동작 즉 함수를 의미한다.
    • GPU가 처리하는 Function 코드라고 볼 수 있다.
  • 쓰레드

    • 커널을 실행하는 단위, 하나의 쓰레드가 하나의 커널을 실행한다.
    • 쓰레드는 3차원(x,y,z)로 구성되어 있다.
    • GPU 병렬 프로그래밍의 특징은 3차원으로 할당된 쓰레드(함수, 커널)가 동일한 기능의 함수를 동시에 수행하는 것이 그 특징이라고 볼 수 있다.
  • 그룹

    • 동시에 쓰레드들을 실행하는 단위
    • 쓰레드 그룹이라고 불린다.
    • 그룹 역시 동시 실행이 가능하며 그룹 또한 3차원으로 구성이 된다.
 //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);
}
  • 위 코드에 numthreds(1024,1,1) 은 1024 x 1 x 1 구조로 생성하여 사용한다. 즉 1024개의 쓰레드가 그룹에 포함 되어있다.
  • 초록과 빨강을 번갈아 그려주고 있다.
 #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좌표 기준으로 쓰레드 그룹의 인덱스를 번갈아서 그려주므로써 초록, 빨강이 반복되는 줄무늬가 완성될 것이다.

  • 우측 상단에 초록, 빨강이 반복되는 화면이 그려지고 있다.
profile
공부 기록용 블로그입니다

0개의 댓글