ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1068) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (181) N
      • Unreal (69)
      • Unity (101) N
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • 파이썬
  • 티스토리챌린지
  • string
  • 배열
  • 그래픽스
  • 백준
  • 포인터
  • Unity
  • 문자열
  • 언리얼
  • 클래스
  • 프로그래머스
  • 함수
  • c#
  • 유니티
  • 오블완
  • 알고리즘
  • C++
  • C
  • SQL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

그래픽스/DirectX

DirectX 렌더 대상 뷰 (RTV) 생성

2023. 7. 12. 11:31

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);
}

출처 : Direct3D의 초기화 - 7.렌더 대상 뷰(RTV) 생성 (tistory.com)

저작자표시 (새창열림)

'그래픽스 > 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
    '그래픽스/DirectX' 카테고리의 다른 글
    • DirectX와 HLSL간의 행렬 순서와 연산
    • [DX11] 튜토리얼 2 - 삼각형 렌더링
    • [DX11 물방울책] 챕터 7 - 광원
    • [DX11 물방울책] 챕터 6 - 색상 주기, 특수한 모형 그리고 API 인터페이스
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바