LEARNING / 기술 노트

Direct3D 12 렌더러 구현 12주 계획

C++과 HLSL로 창에 한 프레임을 표시하고, GPU 리소스 수명과 3D 렌더링을 다룬 뒤 PIX로 개별 드로우와 인스턴싱을 비교합니다.

한 프레임에서 렌더러까지

C++과 HLSL로 Windows에서 실행하는 렌더러를 구성합니다. 먼저 백 버퍼를 한 가지 색으로 채우고 화면에 표시합니다. 여기에 정점과 셰이더를 연결한 뒤, GPU가 작업 중인 메모리를 안전하게 관리하면서 카메라·텍스처·조명을 붙입니다. 마지막에는 동일한 장면에서 개별 드로우와 인스턴싱의 CPU 제출 시간과 GPU 실행 시간을 비교합니다.

주당 6~8시간을 가정합니다. 변수·제어문·함수 등 C#과 C에도 있는 기본 문법은 이미 익혔다고 전제합니다. C++의 RAII와 ComPtr은 객체를 생성하고 정리하는 코드에서 다룹니다. GPU가 리소스 사용을 끝내는 시점은 펜스로 별도 확인합니다. Direct3D 12의 명령 제출, 펜스 기반 리소스 관리

과정 목록에서 주차별 글을 엽니다. 1주차 실습은 공식 샘플을 내려받아 빌드하고, 배경색을 바꾸며 명령 기록·제출·화면 표시 위치를 구분하는 작업입니다.

2주차 실습에서는 삼각형의 색을 결정하는 HLSL 코드를 바꾸고, PIX에서 정점 세 개를 그리는 호출과 파이프라인 상태를 확인합니다.

주차별 진행과 완료 기준

주차구현할 작업다음 단계로 넘어가는 기준
1Win32 창에서 Direct3D 12로 백 버퍼를 지우고 DXGI로 표시합니다.색을 바꾸고 ClearRenderTargetView, ExecuteCommandLists, Present가 각각 어디서 호출되는지 찾습니다.
2정점 버퍼, HLSL 셰이더, 파이프라인 상태를 연결해 삼각형을 그립니다.PIX에서 드로우 호출을 선택하고 연결된 정점 버퍼와 셰이더를 찾습니다.
3펜스 값으로 GPU 완료 지점을 기록합니다.커맨드 리스트를 기록할 때 쓴 할당자를 다시 초기화할 수 있는 조건을 설명합니다.
4프레임별 할당자와 업로드 메모리 영역을 둡니다.GPU가 이전 프레임을 실행하는 동안 CPU가 다음 프레임을 기록해도 같은 메모리에 접근하지 않는 이유를 설명합니다.
5월드·뷰·투영 행렬과 이동 가능한 카메라를 연결합니다.알려진 한 점이 좌표계를 거치며 어디에 표시되는지 예상하고 화면과 비교합니다.
6인덱스 메시 두 개를 겹쳐 그리고 깊이 버퍼를 연결합니다.카메라를 움직이거나 그리는 순서를 바꿔도 가까운 표면이 보이는 이유를 설명합니다.
7텍스처를 업로드하고 SRV와 샘플러를 셰이더에 연결합니다.텍스처 복사, 읽기 상태로의 전환, 업로드 버퍼의 정리 시점을 차례로 짚습니다.
8표면 법선과 방향광 하나를 적용합니다.빛의 방향을 고정하고 모델을 회전하거나 비균일 스케일을 적용했을 때 밝기가 달라지는 이유를 설명합니다.
9동일한 메시를 반복 배치하고 고정 카메라로 측정 장면을 만듭니다.카메라 경로·해상도·개체 수를 기록하고 같은 장면을 반복 실행합니다.
10개별 드로우와 인스턴싱을 전환할 수 있게 합니다.두 경로에서 배치·재질·보이는 메시가 일치하는지 확인합니다.
11PIX에서 CPU 제출 시간과 GPU 실행 시간을 분리해 비교합니다.개체 수를 바꿔 같은 조건으로 반복 측정하고, 차이가 생긴 구간을 캡처에서 찾습니다.
12실행 파일과 재현 절차, 비교 결과를 정리합니다.다른 사람이 같은 조건으로 실행할 수 있고, 핵심 프레임 흐름을 자료 없이 다시 작성하고 설명할 수 있습니다.

구현을 확인하는 순서

  1. 바뀌어야 할 화면 또는 타임라인을 예상합니다.
  2. 한 부분을 구현하고 기대한 동작을 확인합니다.
  3. 배리어·바인딩·상태 중 하나를 바꿔 어떤 오류나 화면 차이가 생기는지 관찰합니다.
  4. 수정 뒤 다시 실행하고, 자료를 닫은 상태에서 핵심 코드와 선택한 이유를 설명합니다.

성능 비교에서는 같은 장면과 빌드 설정을 사용합니다. 해상도와 카메라, 개체 수를 고정하고 시작 직후의 준비 구간을 분리합니다. 개별 드로우에서 인스턴싱으로 바꿨을 때 어느 구간의 시간이 바뀌었는지 CPU와 GPU를 나눠 기록합니다. PIX GPU 캡처, PIX 타이밍 캡처

Direct3D 12 렌더러 구현

  1. 01Direct3D 12 렌더러 구현 12주 계획
  2. 02Direct3D 12 첫 프레임과 배경색
  3. 03Direct3D 12 HLSL 삼각형과 PIX 드로우 캡처
← 글 모아보기