본문 바로가기

DirectX/DirectX11 기초 개념

Direct3D 11 디바이스

DirectX 11로 시작하는 3D 게임 프로그래밍 // 이용희 지음 // 프레릭

 

 

 

반복 학습해야 할 내용

 - Direct3D Device와 DeviceContext 개념 이해

 

 

1. Direct3D 디바이스

 

Direct3D 디바이스는 그래픽 출력을 위하여 그래픽 카드(또는 어댑터)를 추상화한 소프트웨어 객체이다.

 

Direct3D를 사용하여 3D 그래픽 응용 프로그램을 작성하려면 하드웨어 장치인 그래픽 카드 또는 어댑터에 대응되는 소프트웨어 객체가 필요하다.

이러한 객체를 Direct3D 디바이스라고 한다.

 

그러므로 Direct3D 응용 프로그램을 작성하기 위한 첫 번째 과정은 Direct3D 디바이스생성하는 것이다.

 

Direct3D 응용 프로그램은 Direct3D 디바이스(실제로는 디바이스 인터페이스)를 통하여 Direct3D가 제공하는 3D 그래픽 기능을 사용한다.



 

 

 

2. Direct3D 디바이스 컨텍스트



디바이스 컨텍스트는 디바이스가 사용되는 환경이나 설정 포함한다.

 

디바이스 컨텍스트는 파이프라인 상태에 사용되고 디바이스가 소유한 리소스를 사하여 렌더링 명령을 생성한다.

 

Direct3D의 디바이스는 ID3D11Device 인터페이스 클래스로 표현되며 래픽 리소스 생성 그래픽스 파이프라인 구성하고 셰이더 생성하기 위한 용도로 사용한다.

 

디바이스 컨텍스트는 ID3D11DeviceContext 인터페이스로 표현되며 그래픽 리소스셰이더파이프라인 연결하고 렌더링을 수행하기 위하여 사용한다.

 

 

DXGI

 

윈도우 운영체제에서 그래픽 하드웨어는 디스플레이 드라이버와 DXGI(DirectX Graphics Infrastructure)를 통하여 추상화된다.

 

Direct3D 10부터 윈도우 디스플레이 모델에 DirectX를 위해 DXGI라는 소프트웨어 계층이 추가되었다.

 

DXGI는 DirectX 그래픽 런타임독립적인 저수준의 작업(하드웨어 장치를 열거나 화면으로 출력하는 것)을 관리하며 DirectX 그래픽을 위한 기본적이고 공통적인 프레임워크를 제공한다.

 

DXGI가 제공하는 기본적인 작업은 하드웨어 디바이스의 열거, 디스플레이 모드의 나열, 출력 장치(모니터)의 나열, 스왑체인 생성, 프레젠테이션, 전체 화면 모드 전환 등을 포함한다.

 

DXGI의 목적은 ※커널 모드 드라이버 그리고 그래픽 하드웨어통신하는 것이다.

{

※ 유저모드와 커널모드

커널에서 중요한 자원을 관리하기 때문에, 사용자가 그 중요한 자원에 접근하지 못하도록 모드를 2가지로 나눔

유저모드 : 프로그램 자원에 함부로 침범하지 못함

커널모드 : 모든 자원(드라이버, 메모리, CPU 등)에 접근, 명령을 할 수 있다.

}

 

응용 프로그램이 디바이스를 열거하거나 데이터가 화면으로 프리젠트되는 것을 제어할 필요가 있다면 DXGI를 직접 사용할 수 있다.

 

 

 

 

 

3. Direct3D 파이프라인



Direct3D 디바이스를 생성하여 그래픽 파이프라인을 구성한 다음 디바이스와 관련된 상태 객체들을 관리하며 셰이더를 구성해야 한다.

 

  1. 디바이스 초기화
  2. 데이터 제공
  3. 셰이더와 리소스 결합
  4. 상태 설정
  5. 그리기




DXGI_SAMPLE_DESC 구조체

 

모니터의 픽셀 크기가 아주 작지 않기 때문에 선분이 계단처럼 그려질 수 있다.

이러한 현상을 계단 현상(Stair-Step Effect, 앨리어싱 Aliasing)이라고 한다. 

소프트웨어적으로 계단 현상을 없애는 방법을 다중 샘플링(Multi-Sampling)이라고 한다.

 

 

슈퍼 샘플링(Super-Sampling)

 

렌더 타겟 즉, 후면 버퍼의 크기를 실제 화면의 크기보다 4(2X2)배 더 크게 만들어 렌더링한다. 그리고 프리젠트할 때 후면 버퍼를 샘플링(4개의 픽셀을 평균)하여 픽셀 색상을 구하여 프리젠트 한다.

 

 

다중 샘플링

 

화면보다 4배 큰 후면 버퍼

화면의 한 픽셀에 4개의 후면 버퍼 픽셀(서브 픽셀)이 존재하게 된다.

그러나 후면 버퍼의 각 픽셀에 대한 색상을 계산하지 않고 화면의 한 픽셀에 대하여 픽셀의 중심에서 한번만 색상을 계산

그리고 그 색상 정보를 후면 버퍼의 픽셀들의 가시성과 커버리지에 기반을 두어 공유한다.

가시성은 후면 버퍼의 픽셀이 카메라에 보이는가를 의미하며 깊이/스텐실 검사를 통하여 결정한다.

커버리지는 후면 버퍼의 픽셀의 중심이 렌더링하는 다각형의 내부 또는 외부에 위치하는가를 의미한다.

 

모든 Direct3D 11 디바이스는 4X 다중 샘플링을 지원한다.

Direct3D 디바이스가 지원하는 다중 샘플링 방식을 MSAA(Multi-Sample Anti-Aliasing)라고 한다.

Direct3D 디바이스의 다중 샘플링은 스왑 체인의 후면 버퍼에 렌더링을 하고 이것을 화면으로 프리젠트할 때 일어난다. 그러므로 스왑 체인을 생성할 때 다중 샘플링에 대한 설정을 해야 한다.

 

 

 

 

 

 

 

'DirectX > DirectX11 기초 개념' 카테고리의 다른 글

Direct3D 리소스  (0) 2021.04.30
Direct3D 11 렌더링 파이프라인  (0) 2021.04.30
3D 그래픽과 Direct3D  (0) 2021.04.22
3D 그래픽의 이해  (0) 2021.04.22