공부중

[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 6 본문

Programing/DirectX

[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 6

곤란 2018. 4. 17. 23:13
반응형

몸이 다 나은건 아니지만 틈틈히 공부는 해야되지 않겠는가 ㅠ

몸도 안좋은데 게으름도 넘쳐나니 ... 

 

아무튼 이번코드는 다음과 같다.

 

        // 이 샘플은 전체 화면 전환을 지원하지 않습니다.
	ThrowIfFailed(factory->MakeWindowAssociation(Win32Application::GetHwnd(), DXGI_MWA_NO_ALT_ENTER));

	ThrowIfFailed(swapChain.As(&m_swapChain));
	m_frameIndex = m_swapChain->GetCurrentBackBufferIndex();

	// 설명자 힙(descriptor heaps)을 작성하십시오.
	{
		// 렌더 타겟 뷰 (RTV) 서술자 힙을 기술하고 생성하십시오.
		D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
		rtvHeapDesc.NumDescriptors = FrameCount;
		rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
		rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
		ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap)));

		m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
	}

         // 프레임 리소스를 만듭니다.
	{
		CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart());

		// 각 프레임에 대해 RTV(렌더 타겟 뷰)를 만듭니다.
		for (UINT n = 0; n < FrameCount; n++)
		{
			ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n])));
			m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle);
			rtvHandle.Offset(1, m_rtvDescriptorSize);
		}
	}

	ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator)));

제일 먼저 factory의 멤버 함수로 MakeWindowAssociation이라는 함수를 호출하는데 

DXGI가 응용프로그램의 메시지 대기열을 Alt + Enter 키에 모니터 할 수 있게 한다..

 

지금 여기서는 전달 인자로 DXGI_MWA_NO_ALT_ENTER를 넘겨주었으니

Alt + Enter키를 눌렀을때 전체화면 전환을 막는다고 생각을 하면 될것 같다.

자세한 내용은 역시 MSDN을 살펴보자 - 링크

 

다음은 swapChain.As 로 &m_swapChain 을 받고 있는데

이 As는 ComPtr의 As이다 (IDXGISwapChain1의 멤버가 아니다) - ComPtr::As MSDN링크

아무튼 생성한 swapChain을 멤버변수인 m_swapChain에 저장한다고 생각하면 된다.

 

다음줄은 현재 백버퍼(Backbuffer)의 Index를 받아서 멤버 프레임 인덱스에 저장한다.

 

이제 descriptor heaps(설명자 힙)을 작성하는 부분이 남아있다. 

어디 모 책에서는 서술자와 뷰(View)가 동의어라고 한다.

 

아무튼 서술자는 자원의 사용법에 따라서 여러 종류가 있다고 한다.

 

일단 아래 내용정도.....? 이거말고 더 있나??

* CBV(contant buffer view) SRV(shader resource view), UAV(unordered access view)

* 표본추출기(sampler) 자원.

* RTV(Render Target View).

* DSV(Depth/Stencil)자원.

자세한것은 그때그때 사용할때 다시 정리해 보는것으로 하고

여기서는 RTV(Render Taget View)만 쓰인다.

 

여기서는 간단한 렌더 타겟 뷰라고 타입(D3D12_DESCRIPTOR_HEAP_TYPE_RTV)과 플래그(D3D12_DESCRIPTOR_HEAP_FLAG_NONE) 그리고 갯수(FrameCount)를 지정해주고 랜더타겟뷰의 descriptor의 크기를 멤버에 저장했다.

 

마지막으로 프레임 리소스를 만들어 주는데 CD3DX12_CPU_DESCRIPTOR_HANDLE형으로 렌더타겟뷰의 핸들을 만들고

각각의 프레임에 대해서 렌더타겟뷰를 만들어 준다.

 

마지막 라인은 명령할당을 생성해준다.

 

이제 길고긴 D3D12HelloWindow::LoadPipeline() 함수가 끝이 났다

다음에는 LoadAssets( ) 함수를 살펴보자

 

다음 글에서...

 

 

 

 

 

 

 

 

 

반응형