본문 바로가기
DirectX11/정보정리

[DirectX11] DirectX3D 초기화(2)

by 마두식 2022. 10. 28.
반응형

※  아래의 내용들은 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

댓글