공부중
[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 6 본문
몸이 다 나은건 아니지만 틈틈히 공부는 해야되지 않겠는가 ㅠ
몸도 안좋은데 게으름도 넘쳐나니 ...
아무튼 이번코드는 다음과 같다.
// 이 샘플은 전체 화면 전환을 지원하지 않습니다.
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키를 눌렀을때 전체화면 전환을 막는다고 생각을 하면 될것 같다.
다음은 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( ) 함수를 살펴보자
다음 글에서...
'Programing > DirectX' 카테고리의 다른 글
[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 8 (0) | 2018.05.13 |
---|---|
[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 7 (0) | 2018.05.07 |
[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 5 (0) | 2018.04.11 |
[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 4 (0) | 2018.04.08 |
[DirectX12]Hello Wolrd Sample - D3D12HelloWindow - 3 (0) | 2018.04.07 |