(Directx12) (4장) (2) Direct3D 기본 구조

기본 Direct3D 구성

1. 초기화 단계★

DirectX12 초기화는 다음 단계를 따릅니다.

0.winapi를 통해 mainWindow를 생성한 후 핸들을 가져옵니다.

1. IDXGIFactory4 생성

2. ID3D12Device 생성

3. 펜스를 생성하고 4X MSAA 품질 수준이 지원되는지 확인(지원/미지원, 최대 수준)

4. 명령 대기열, 명령 디스패처 및 명령 목록 생성

5. 교환 체인 생성(창 핸들 필요)

6. 설명자 힙 생성

7. 교환 체인의 백 버퍼 및 RTV 디스크립터 힙에 대한 RTV 생성

8. 깊이 템플릿 버퍼를 만들고 리소스 및 DSV 설명자 힙에 대한 DSV를 만듭니다.

9. 뷰포트 및 가위 사각형 구조 초기화

.

일반적인 함수 구조는 다음과 같습니다.

초기화 기능

{

메인 윈도우 생성();

공장 생성();

장치 생성(); // 기본 어댑터로 빌드가 실패하면 공장에서 다른 어댑터를 가져옵니다.

펜스 생성 및 mxaa 품질 수준 확인(); // 장치 사용

명령 생성 트리오(); // 장치 사용

교환 체인 생성(); // 장치, 명령 대기열, 기본 창 핸들 사용

디스크립터 heap() 생성; // 장치 사용

.

onResize(); /7,8,9 포함

.

}

.

onResize() // 7, 8, 9는 출력 창 크기를 조정할 때마다 반복해서 호출해야 하므로 생략합니다.

{

명령 대기열 지우기 및 명령 목록 재설정(); //이 함수에서 gpu 명령을 사용하려면 공백으로 시작합니다.

.

교환 체인 백 버퍼 및 기존 dsv 리소스 reset(); // 초기화에는 의미가 없지만 크기 조정에는 필요합니다.

exchange chain()에서 새 크기의 새 백 버퍼를 만듭니다.

// 교환 체인 기능으로 제공

.

교환 체인 백 버퍼 및 RTV heap()의 핸들에 대한 RTV를 생성합니다.

.

깊이 템플릿 버퍼 생성();

깊이 템플릿 버퍼 핸들 및 DSV heap()에 대한 DSV를 만듭니다.

.

깊이 템플릿 버퍼의 상태 전이 명령을 명령 목록에 삽입하고 queue() 명령을 보냅니다.

빈 명령 queue();

.

초기화()는 뷰포트의 크기와 Scissors Rectangle 구조를 조정합니다.

}

.

이 init 함수를 처리하면 9단계까지의 초기화가 완료된다.

초기화 중에 얻은 다양한 개체 또는 데이터는 나중에 사용할 수 있도록 전역 또는 멤버 변수에 저장됩니다.

Init 기능을 처리한 후 Run 기능의 프레임 루프를 즉시 실행할 수 있습니다.

.

.

2. 프레임 루프

Init 기능이 실행된 후 Run 기능이 실행되어 프레임 루프에 진입합니다.

함수 구조는 다음과 같습니다.

달리다()

{

Windows 메시지 구조 선언 msg;

초기화 타이머 // 타이머는 여기에서 설명합니다.

동안(msg !
= EXIT)

{

if(PeekMessage(&msg…..)) //메시지가 있으면 처리, 없으면 프레임 처리

{

메시지 번역(msg)

배송 메시지(msg)

}

다른

{

timer.Tick(); // 타이머를 업데이트하여 deltaTime을 계산합니다.

if(앱이 일시중지되지 않은 경우)

{

fps를 계산하고 제목으로 출력합니다.

Update(timer) // 기하학과 같은 추상 정보를 계산합니다.

Draw(timer) // 계산된 추상 정보로 실제 렌더링

}

다른

{

수면(100); // 앱 일시정지 시 100단위로 대기

}

}

}

.

}

.

3. 타이머★

실시간 렌더링을 사용하면 각 프레임에 대해 변경 사항을 계산해야 합니다.

이 시점에서 타이머 객체가 생성되어 시간 흐름에 사용됩니다.

Timer 객체의 Tick 메서드는 매 프레임마다 호출되며 프로그램의 시간은 매번 호출되어 시간의 경과를 계산하고 기록합니다.

Timer 개체의 주요 작업은 deltaTIme을 제공하는 것입니다.

이는 각 프레임의 시간 변화와 일시 중지 시간 없이 주어진 시점 이후 경과된 총 시간입니다.

.

4. 메시지 처리

메시지 처리를 위해 mainWindow 생성 시 메시지 핸들러로 사용할 전역 함수에 대한 포인터를 desc 구조체에 기록하고, mainWindow 생성 시 창에 생성된 메시지를 전역 함수로 전달하여 처리한다.

.

객체의 메서드를 메시지 프로시저로 사용하려면 적절한 전역 함수에서 객체에 액세스할 수 있도록 정적 클래스 변수 또는 전역 변수에 저장한 다음 전역 변수에서 객체의 메서드를 호출합니다.

.

.

.

.

참고 도서

DirectX 12를 사용한 3D 게임 프로그래밍 소개