일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Direct Init
- engine
- 동기화
- DESC
- CommandList
- C++
- GPU
- 게임수학
- DirectX12
- 프로그래밍
- UE4
- Input Assembler
- vertex
- DirectX
- View
- C언어
- 세팅
- CPU
- 다중표본화
- RenderTargetView
- Direct3D
- 다이렉트X
- 전처리문
- c
- DirectXTK
- 다이렉트 초기화
- 다이렉트X 튜토리얼
- Direct3D Init
- 코딩
- swapchain
- Today
- Total
비타Cpp
Direct3D의 초기화 - 7.렌더 대상 뷰(RTV) 생성 본문
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);
}
'DirectX12 > 튜토리얼' 카테고리의 다른 글
Direct3D의 초기화 - 뷰포트 생성 (0) | 2021.10.09 |
---|---|
Direct3D의 초기화 - 8. 깊이·스텐실 버퍼와 뷰 생성 (0) | 2021.10.09 |
Direct3D의 초기화 - 6. 서술자 힙 생성 (0) | 2021.10.04 |
Direct3D의 초기화 - 5. 교환 사슬(Swapchain)의 서술과 생성 (0) | 2021.10.02 |
Direct3D의 초기화 - 4. 명령 대기열과 명령 목록 생성 (0) | 2021.10.02 |