본문 바로가기

그래픽스

[DX12] Root Signature

Root Signature 안에 많은 데이터를 담아야할 경우 Table을 담을 수 있다. 

 

	CD3DX12_DESCRIPTOR_RANGE ranges[] =
	{
		CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, CBV_REGISTER_COUNT, 0), // b0~b4
	};

	CD3DX12_ROOT_PARAMETER param[1];
	param[0].InitAsDescriptorTable(_countof(ranges), ranges);

 

테이블의 형식을 정의하고 (CBV형식을 REGISTER_COUNT만큼 사용하겠다) InitAsDescriptorTable로 테이블 데이터를 RootSignature에 서명한다. 

 

// TODO
	// 1) Buffer에다가 데이터 세팅
	// 2) TableDescHeap에다가 CBV 전달
	// 3) 모두 세팅이 끝났으면 TableDescHeap 커밋
	{
		D3D12_CPU_DESCRIPTOR_HANDLE handle = GEngine->GetCB()->PushData(0, &_transform, sizeof(_transform));
		GEngine->GetTableDescHeap()->SetCBV(handle, CBV_REGISTER::b0);
	}
	{
		D3D12_CPU_DESCRIPTOR_HANDLE handle = GEngine->GetCB()->PushData(0, &_transform, sizeof(_transform));
		GEngine->GetTableDescHeap()->SetCBV(handle, CBV_REGISTER::b1);
	}
    
    	GEngine->GetTableDescHeap()->CommitTable();

 

그리고 실제로 Render하는 부분에서 PushData로 상수 버퍼에 데이터들을 집어넣는다. 그리고 SetCBV로 TableDescriptorHeap에 CBV를 복사한다. 과정이 모두 끝나면 CommitTable로 Table의 주소를 레지스터에 전송한다.

 

void TableDescriptorHeap::CommitTable()
{
	D3D12_GPU_DESCRIPTOR_HANDLE handle = _descHeap->GetGPUDescriptorHandleForHeapStart();
	handle.ptr += _currentGroupIndex * _groupSize;
	CMD_LIST->SetGraphicsRootDescriptorTable(0, handle);

	_currentGroupIndex++;
}

'그래픽스' 카테고리의 다른 글

[DX12] Texture Mapping  (0) 2022.07.23
[DX12] Index Buffer  (0) 2022.07.22
[DX12] Constant Buffer  (0) 2022.07.22
[DX12] Frustum Culling  (0) 2022.02.28
[DX12] Normal Mapping  (0) 2022.02.28