파이프라이닝 구현
월드 tranform이 기본값으로 고정된 박스 기하구조 하나를 렌더링하는 프로그램 기준으로 설명한다.
1.초기화 단계
기본 구현의 9번까지의 초기화 다음에 다음과 같은 초기화 과정이 추가된다.
1~9 기본 초기화
10. 상수 버퍼 힙 생성
11. 업로드 상수 버퍼 생성 및 힙 핸들에 뷰로 연결
12. 루트 서명 생성 (셰이더에 전달될 추가 버퍼들 나열)
13. 쉐이더 컴파일
14. 입력 배치 서술 생성 (셰이더에 전달될 정점 버퍼들의 특성 나열)
15. 기하구조 생성 (MeshGeometry를 생성하고 거기에 사용할 정점버퍼 및 색인버퍼 생성 + SubMesh 생성)
16. 파이프라인 상태 객체 (PSO) 생성
+명령 목록 제출 및 FlushQueue
위 과정을 모두 수행한 뒤 Run루프로 진입하면 프로그램이 정상 작동한다.
보통 함수구조는 다음과 같다.
init함수()
{
기본 초기화();
상수 버퍼 힙 생성();
업로드 상수 버퍼 생성 및 힙 핸들에 뷰로 연결();
루트서명 생성();
쉐이더 컴파일();
입력 배치 서술 생성();
기하구조 생성();
PSO 생성();
명령 목록 제출();
FlushQueue();
}
기본 초기화에서의 수정사항
onResize시 수정된 종횡비를 이용하여 전역 투영행렬을 수정하는 내용을 추가해야한다.
2.프레임 루프
기존 프레임 루프를 그대로 사용하되 update 및 draw를 새롭게 작성한다.
update()
{
이벤트에 의해 수정된 카메라 데카르트 좌표 가져오기;
카메라 위치 좌표, target좌표, 세계 up 벡터로 시야행렬 얻기();
수정된 시야행렬 전역에 갱신();
월드, 시야, 투영 행렬을 곱해 WVP 행렬 얻기;
업로드 상수 버퍼에 WVP행렬 갱신;
}
draw()
{
명령 할당자 리셋();
명령 목록에 명령 할당자와 PSO를 등록하며 리셋();
명령 목록 - 뷰포트 및 시야 직사각형 설정;
명령 목록 - 현재 후면버퍼 상태 present -> render target;
명령 목록 - 후면 버퍼 및 깊이 스텐실 버퍼 지우기;
명령 목록 - 후면 버퍼 및 깊이 스텐실 버퍼를 렌더 타겟으로 등록;
명령 목록 - 쉐이더에 사용할 힙들 등록;
명령 목록 - 루트 서명 등록;
명령 목록 - 정점 버퍼 및 색인 버퍼 등록;
명령 목록 - 사용할 기본도형 위상구조 설정;
명령 목록 - 쉐이더 추가 자원 등록;
명령 목록 - 특정 기하구조의 색인버퍼 범위, 정점 버퍼 베이스index를 넘겨 주며 렌더링 파이프라인 실행
명령 목록 - 현재 후면버퍼 상태 render target -> present;
명령 목록 닫기;
명령 큐에 명령 목록 제출;
스왑 체인으로 명령 큐에 버퍼 swap명령어 제출;
전역 후면버퍼 인덱스 갱신;
FlushQueue();
}
WVP는 기하구조 인스턴스마다 존재하는데 현재 프로그램은 박스하나만 존재하기에 전역으로 하나만 관리한다.
world행렬은 단위행렬로 고정이다.
시야 행렬은 매 프레임 카메라의 위치에 따라 갱신된다.
투영 행렬은 onResize시 종횡비에 따라 갱신된다.
3.메세지 처리부
메세지 처리부에서 마우스 드래그를 감지하여 카메라의 위치 전역 변수를 수정하도록 한다.
그러면 update에서 매 프레임의 시야 행렬을 새로 계산해 카메라가 움직이는 효과가 나타난다.
참고서적
DirectX 12를 이용한 3D 게임 프로그래밍 입문
'그래픽스 > DirectX12' 카테고리의 다른 글
[Directx12][8장][1]조명 (1) | 2023.03.21 |
---|---|
[Directx12][7장]파이프라이닝2 (0) | 2023.03.21 |
[Directx12][6장][1]파이프라이닝 구현 - 기본 지식 (0) | 2023.03.21 |
[Directx12][5장]렌더링 파이프라인 (0) | 2023.03.21 |
[Directx12][4장][2]Direct3D 기본 구조 (0) | 2023.03.21 |