비타Cpp

Direct3D의 초기화 - 6. 서술자 힙 생성 본문

DirectX12/튜토리얼

Direct3D의 초기화 - 6. 서술자 힙 생성

멍C 2021. 10. 4. 01:34

다음으로, 응용 프로그램에 필요한 서술자/뷰들을 담을 서술자 힙을 만들어야 한다.

서술자 힙(Descriptor Heap)은 ID3D12DescrptorHeap 인터페이스로 대표된다. 힙을 생성하는 메서드는 ID3D12Device::CreateDescriptorHeap이다. SwapChainBufferCount에 설정된 개수만큼의 렌더 대상 뷰(Render Target View, RTV)들과 하나의 깊이·스텐실 뷰(Depth/Stencil View, DSV)가 필요하다. 렌더 대상 뷰는 교환 사슬에서 렌더링의 대상이 되는 버퍼 자원을 서술하고, 깊이·스텐실 뷰는 깊이 판정을 위한 버퍼자원을 서술한다. 서술자 힙은 서술자 종류마다 따로 만들어야 한다.

다음은 이 힙들을 생성하는 코드이다.

//D3DApp.h
Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> mRtvHeap;
Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> mDsvHeap;

//D3DApp.cpp
void D3DApp::CreateRtvAndDsvDescriptorHeaps()
{
    D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc;
    rtvHeapDesc.NumDescriptors = SwapChainBufferCount;
    rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
    rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
	rtvHeapDesc.NodeMask = 0;
    ThrowIfFailed(md3dDevice->CreateDescriptorHeap(
        &rtvHeapDesc, IID_PPV_ARGS(mRtvHeap.GetAddressOf())));


    D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc;
    dsvHeapDesc.NumDescriptors = 1;
    dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
    dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
	dsvHeapDesc.NodeMask = 0;
    ThrowIfFailed(md3dDevice->CreateDescriptorHeap(
        &dsvHeapDesc, IID_PPV_ARGS(mDsvHeap.GetAddressOf())));
}

 

힙을 성공적으로 생성하고 나면 힙에 저장된 서술자들에 접근할 수 있다. 힙의 첫 서술자에 대한 핸들은 ID3D12DescriptorHeap::GetCPUDescriptorHandleForHeapStart 메서드로 얻는다. 다음은 각각 현재의 후면 버퍼 RTV와 DSV에 대한 핸들을 얻는 함수들이다.

D3D12_CPU_DESCRIPTOR_HANDLE D3DApp::CurrentBackBufferView()const
{
	// 편의를 위해 CD3DX12_CPU_DESCRIPTOR_HNDLE의 생성자를 사용한다.
	// 이 생성자는 주어진 오프셋에 해당하는 후면 버퍼 RTV의 핸들을 돌려준다.
	return CD3DX12_CPU_DESCRIPTOR_HANDLE(
		mRtvHeap->GetCPUDescriptorHandleForHeapStart(),	//첫 핸들
		mCurrBackBuffer,								//오프셋 색인	
		mRtvDescriptorSize);							//서술자의 바이트 크기
}

D3D12_CPU_DESCRIPTOR_HANDLE D3DApp::DepthStencilView()const
{
	return mDsvHeap->GetCPUDescriptorHandleForHeapStart();
}

 

Comments