※ 아래의 내용들은 DirectX 11을 이용한 3D 게임 프로그래밍 입문 책의 내용을 바탕으로 작성된 것입니다.
Direct3D의 초기화 과정 (2 ~ 8)
- 4X MSAA 품질 수준 지원 점검
- 모든 Direct3D 11 대응 장치는 모든 렌더 대상 형식에 대해 4X MSAA를 지원한다.
=> 지원하는 품질 수준은 서로 다를 수 있다.
- 교환 사슬의 설정
- 교환 사슬을 서술하는 구조체 인스턴스를 만들어 원하는 교환 사슬의 특성들을 설정
- 후면 버퍼에 대해 8비트 RGBA를 사용하는 이유는 일반적으로 모니터의 색상당 비트 수가 24비트 이하이므로 정밀도를 그보다 더 높게 잡아봤자 낭비이기 때문이다.
=> 알파 성분이 차지하는 여분의 8비트는 모니터가 출력하는 것이 아니다.
=> 그러나 후면 버퍼에 여분의 8비트를 두면 몇 가지 특수 효과들에 활용할 수 있다.
- 교환 사슬의 생성
- 교환 사슬 인터페이스 생성
- DXGI는 Direct3D와는 개별적인 API로, 교환 사슬 설정, 그래픽 하드웨어 나열, 창 모드와 전체화면 모드 전환 등그래픽에 관련된 작업을 처리한다.
- 이를 Direct3D와 분리한 이유는, 다른 그래픽 AI에도 교환 사슬, 그래픽 하드웨어 열기, 창 모드와 전체화면 모드 전환 등이 필요하기 때문이다.
- 렌더 대상 뷰 생성
- 어떤 자원을 파이프라인의 단계에 직접 묶는 것이 아니라 반드시 자원에 대한 뷰를 생성하고 그 뷰를 파이프라인 단계에 묶어야 한다.
ex) 후면 버퍼를 파이프라인의 출력 병합기 단계에 묶으려면(그래야 Direct3D가 버퍼에 뭔가를 그릴 수 있음) 우선 후면 버퍼에 대한 렌더 대상 뷰를 생성해야 한다.
- 깊이ㆍ스텐실 버퍼와 뷰 생성
- 깊이 버퍼는 그냥 깊이 정보를 담는(그리고 스텐실을 사용하는 경우 스텐실 정보도 담는) 2차원 텍스처이다.
- 2차원 텍스처를 생성할 때에는 생성할 텍스처를 서술하는 구조체를 채우고 특정 메소드를 호출해야 한다.
- GPU 자원을 CPU에서 동적으로 갱신하면 성능상의 피해가 생긴다. 새 자료를 CPU 메모리(시스템 RAM)에서 GPU 메모리(비디오 RAM)로 전송해야 하기 때문이다.
=> 느린 연산이므로 꼭 필요한 경우가 아니라면 피해야 한다.
- GPU에서 CPU 메모리로의 자료 복사는 느린 연산이므로 꼭 필요한 경우가 아니라면 피해야 한다.
- 최대 속도를 위한 최선의 방법은 모든 자원을 생성해서 GPU에 올린 후 GPU 메모리에 유지하고 GPU만이 그것을 읽고 쓰는 식으로 그래픽 하드웨어가 작동하게 만드는 것이다.
- 뷰들을 출력 병합기 단계에 묶기
- 위에서 생성한 후면 버퍼와 깊이ㆍ스텐실 버퍼에 대한 뷰들을 파이프라인의 출력 병합기 단계에 묶어야 한다.
- 이 과정을 거쳐야 자원들이 파이프라인의 렌더 대상과 깊이ㆍ스텐실 버퍼로 작용하게 된다.
- 렌더 대상 뷰는 여러 개를 배열에 담아서 한 번에 묶을 수 있지만, 깊이ㆍ스텐실 뷰는 하나만 묶을 수있다.
- 뷰포트 설정 및 생성
- 보통은 3차원 장면을 후면 버퍼 전체에 그린다. 그러나 원한다면 3차원 장면을 후변 퍼어의 일부를 차지하는 직사각형 영역에만 그리는 등의 조작도 가능하다.
- 여기서 장면을 그려넣고자 하는 후면 버퍼의 부분직사각형 영역을 뷰포트(viewport)라고 부른다.
타이밍과 애니메이션
- 성능 타이머
- 정밀한 시간 측정을 위해 Windows가 제공하는 성능 타이머(performance timer)를 사용한다. 이를 성능 카운터(performance counter)라고도 부른다
- 성능 타이머는 시간을 개수 단위로 측정한다.
- QueryPerformanceCounter 주의사항 : 다중 프로세서 컴퓨터의 경우 어떤 프로세서에서 이 함수를 호출했는지가 문제되지 않아야 한다. 그러나 기본 입출력 시스템(BIOS)의 버그 또는 하드웨어 추상층(HAL)의 버그 때문에 프로세서에 따라 다른 결과가 나올 수 있다
=> SetThreadAffinityMask 함수를 적절히 이용하면 응용 프로그램의 주 스레드가 다른 프로세서로 전환되는 일을 방지할 수 있다.
- GameTimer 클래스 구현
틀린 부분이나 이상한 부분이 있으면 댓글로 편하게 지적해주세요.
감사합니다!
'DirectX11 > 정보정리' 카테고리의 다른 글
[DirectX11] 렌더링 파이프라인(1) (0) | 2022.11.03 |
---|---|
[DirectX11] 색상 (0) | 2022.11.03 |
[DirectX11] DirectX3D 초기화(1) (0) | 2022.10.26 |
[DirectX11] 행렬과 변환 (0) | 2022.10.25 |
[DirectX11] 벡터 조작 (0) | 2022.10.24 |
댓글