기본 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 게임 프로그래밍 소개