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);
}
'그래픽스 > DirectX' 카테고리의 다른 글
DirectX와 HLSL간의 행렬 순서와 연산 (0) | 2023.07.14 |
---|---|
[DX11] 튜토리얼 2 - 삼각형 렌더링 (0) | 2023.07.12 |
[DX11 물방울책] 챕터 7 - 광원 (0) | 2023.07.11 |
[DX11 물방울책] 챕터 6 - 색상 주기, 특수한 모형 그리고 API 인터페이스 (0) | 2022.11.15 |
[DX11 물방울책] 챕터 5 - 렌더링 파이프라인 (0) | 2022.07.03 |