비타Cpp

Direct3D의 초기화 - 7.렌더 대상 뷰(RTV) 생성 본문

DirectX12/튜토리얼

Direct3D의 초기화 - 7.렌더 대상 뷰(RTV) 생성

멍C 2021. 10. 8. 20:52

Direct3D는 자원 자체를 직접 파이프라인의 단계에 묶지 않는다. 대신 반드시 자원에 대한 뷰(서술자)를 생성해서 그 뷰를 파이프라인 단계에 묶어야 한다. 특히 후면 버퍼를 파이프라인의 출력 병합기(Output Merger) 단계에 묶으려면(그래야 Direct3D가 장면을 후면 버퍼에 렌더링 할 수 있다.) 후면 버퍼에 대한 렌더 대상 뷰를 생성해야 한다. 우선 할 일은 교환 사슬에 저장되어 있는 버퍼 자원을 얻는 것인데, 이를 위해 다음과 같은 메서드를 사용한다.

 

HRESULT IDXGISwapChain::GetBuffer(
  UINT   Buffer,
  REFIID riid,
  void   **ppSurface
);

1. Buffer: 얻고자 하는 특정 후면 버퍼를 식별하는 색인(교환 사슬에 버퍼가 여러 개 있을 수 있으므로 이런 정보가 필요하다.)

2. riid: 그 후면 버퍼를 나타내는 ID3D12Resource 인터페이스의 COM ID.

3. ppSurface: 그 후면 버퍼를 나타내는 ID3D12Resource를 가리키는 포인터가 이 매개변수를 통해서 반환된다.

 

IDXGISwapChain::GetBuffer를 호출하면 해당 후면 버퍼의 COM 참조 횟수가 증가한다. 따라서 버퍼를 다 사용한 후에는 반드시 해제해야 한다. ComPtr을 사용하면 해제가 자동으로 처리된다.

렌더 대상 뷰를 생성할 때에는 ID3D12Device::CreateRenderTargetView 메서드를 사용한다.

void ID3D12Device::CreateRenderTargetView(
  ID3D12Resource                      *pResource,
  const D3D12_RENDER_TARGET_VIEW_DESC *pDesc,
  D3D12_CPU_DESCRIPTOR_HANDLE         DestDescriptor
);

1. pResource: 렌더 대상으로 사용할 자원을 가리키는 포인터.

2. pDesc: D3D12_RENDER_TARGET_VIEW_DESC를 가리키는 포인터. 이 구조체는 렌더 대상 뷰를 서술하는데, 특히 자원에 담긴 원소들의 자료 형식에 관한 멤버를 가지고 있다. 구체적인 자료 형식을 지정해서 자원을 생성했다면 이 매개변수에 널 포인터를 지정해도 된다. 그런 경우 이 메서드는 그 자원을 생성할 때 지정한 자료 형식을 적용해서 그 자원의 첫 번째 밉맵 수준에 대한 뷰를 생성한다.(후면 버퍼에는 밉맵 수준이 하나뿐이다.)

3. DestDescriptor: 생성된 렌더 대상 뷰가 저장될 서술자의 핸들.

 

다음은 이 메서드를 이용해서 교환 사슬의 두 버퍼에 대해 각각 RTV를 생성하는 코드이다.

Microsoft::WRL::ComPtr<ID3D12Resource> mSwapChainBuffer[SwapChainBufferCount];
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHeapHandle(mRtvHeap->GetCPUDescriptorHandleForHeapStart());
for (UINT i = 0; i < SwapChainBufferCount; i++)
{
	//교환 사슬의 i번째 버퍼를 얻는다.
	ThrowIfFailed(mSwapChain->GetBuffer(i, IID_PPV_ARGS(&mSwapChainBuffer[i])));

	//그 버퍼에 대한 RTV를 생성한다.
	md3dDevice->CreateRenderTargetView(mSwapChainBuffer[i].Get(), nullptr, rtvHeapHandle);

	// 힙의 다음 항목으로 넘어간다.
	rtvHeapHandle.Offset(1, mRtvDescriptorSize);
}
Comments