1. Initializing Direct3D

1.1. Initialization Step

  1. IDirect3D8 객체를 만든다.
  2. 호환성 있는 IDirect3D8 객체를 검사한 후, 적정한 디바이스 타입을 고른다.
  3. 디스플레이 모드와 어댑터를 선택한다.
  4. IDirect3DDevice8 객체를 만들고 초기화한다.
  5. 텍스쳐를 사용해 게임 이미지를 불러들인다.
    이렇게 써놓고 보면 상당히 간단한 작업이다. -_-;;

1.2. Purpose of the IDirect3D8 Object

이것을 만드는 이유는 간단하다. IDirect3DDevice8 객체를 만들기 위해서는 "꼭" 필요하기 때문에 만든다. 이 객체에서는 실질적인 작업보다는 초기화를 도와주는 역할을 주로 한다.

1.3. Creating IDirect3D8 Object

그럼 실제로 만들어보자. 만들때에는 다음 함수가 필요하다.

~cpp 
IDirect3D8* Direct3DCreate8 (
  UINT SDKVersion;
);
  1. IN 유일한 인자인 SDKVersion에는 SDK의 버전을 넣어준다. 8.0 이렇게 집어넣는 것이 아니라 지정되어있는 매크로가 있다. 사용하는 방법은 단 한가지뿐이다.


~cpp 
IDirect3D8* pd3d = NULL; // 포인터를 한개 만들어서
pd3d = Direct3DCreate8( D3D_SDK_VERSION ); // 이렇게 생성한다.
///// 해제할때는 이렇게
if( pd3d )
{
  pd3d->Release();
  pd3d = NULL;
}

1.4. Examining Capabilities

요새는 컴퓨터마다 모두 다른 사양을 갖고 있다. 과연 그 컴퓨터가 어떤것을 지원하는지 호환성을 꼭 체크해야한다.

1.4.1. Adapter

설마 그래픽카드(Adapter)를 여러개 다는 집은 흔하지 않을 거라 생각하지만, 만일의 사태를 대비해서 모두 만들어 두었다

~cpp 
UINT IDirect3D8::GetAdapterCount();
  1. RET 몇개의 어댑터가 있는지 알려준다. 1개가 있으면 1, 2개가 있으면 2다.

    어댑터에는 모두 번호가 붙어있다. 첫번째 어댑터에는 0, 두번째 어댑터에는 1, 이런 식이다. 0은 기본으로 있기 때문에 매크로로도 만들어져 있다. D3DADAPTER_DEFAULT 매크로이다. 0번 어댑터를 기본 어댑터라고도 한다.

    그 어댑터는 어떤 상태일까

~cpp 
HRESULT GetAdapterIdentifier {
  UINT Adapter,
  DWORD Flags,
  D3DADAPTER_IDENTIFIER8* pIdentifier
};
  1. RET HRESULT형의 값을 리턴한다. 성공하면 D3D_OK, 실패하면 D3D_INVALIDCALL이 나온다.
  2. IN 첫번째 인자는, 어댑터의 번호이다. 당연히 D3DADAPTER_DEFAULT를 넣어준다.
  3. IN 두번째 인자는 플래그이다. 0이나 D3D_ENUM_NO_WHQL_LEVEL을 넣을 수 있지만, 대개 0을 넣는다.
  4. OUT 세번째 인자를 출력값이다. 그곳의 멤버 변수는 다음과 같다.

~cpp 
    Driver : 드라이버의 이름
    Description : 어댑터의 설명
    DriverVersion : 드라이버의 버전
    VendorID, DeviceID, SubSysID, Revision : 칩셋마다 틀려요
    DeviceIdentifier : 드라이버나 어댑터를 위한 GUID(?)
    WHQLLevel : 인증날짜

1.4.2. Device Type

디바이스의 타입을 얻어온다.

~cpp 
HRESULT GetDeviceCaps(
  UINT Adapter,
  D3DDEVTYPE DeviceType,
  D3DCAPS8* pCaps
);
만들 수 있는 디바이스의 타입은 세 가지가 있다. (2번째 인자의 값으로 사용한다.)
  1. D3DDEVTYPE_HAL : 하드웨어에서 지원하는 기능을 사용한다.
  2. D3DDEVTYPE_REF : HAL 보다 느리지만 소프트웨어적으로 지원
  3. D3DDEVTYPE_SW : 하드웨어 가속을 전혀 사용하지 않고 소프트웨어적으로 에뮬레이션

1.5. Display Format

디스플레이의 포맷을 저장하는 데이터형이 D3DFORMAT라는 형태이다. A,R,G,B 네가지의 값을 몇비트씩 갖는지를 상세하게 정할 수 있다.
자세한 것은 MSDN을,
  1. 32비트 포맷으로는 D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8 등이 있다.
  2. 24비트 포맷으로는 D3DFMT_R8G8B8 이 있다.
  3. 16비트 포맷으로는 D3DFMT_R5G6B5, D3DFMT_X1R5G5B5, D3DFMT_A1R5G5B5, D3DFMT_A4R4G4B4 등이 있다.

1.6. Enumeration Display Mode

1.6.1. Looking at Adapter Display Modes

실행자의 어댑터가 어떤 모드를 표시할 수 있는지 알아보자. 먼저 몇가지 모드를 표시할 수 있는지 알아보자

~cpp 
UINT IDirect3D8::GetAdapterModeCount(
  UINT Adapter;
);
  1. Adapter에는 어댑터의 번호(D3DADAPTER_DEFAULT)를 넣는다. 리턴값은 표시할 수 있는 모드의 개수

    어떤 모드가 어떻게 표시하는지를 알아보려면

~cpp 
HRESULT IDirect3D8::EnumAdapterModes(
  UINT Adapter,
  UINT Mode,
  D3DDISPLAYMODE* pMode
);
  1. Adapter에는 어댑터의 번호를, Mode에는 표시할 모드의 번호(0 ~ GetAdapterModeCount() - 1의 범위)를 넣는다.
  2. pMode에 그 모드의 정보가 나온다.

~cpp 
  Width : 가로폭
  Height : 세로폭
  RefreshRate : 주사율
  Format : 포맷(앞쪽에 나왔던)

1.6.2. Getting the Current Display Mode

현재 어떤 모드인지 얻어올 수 있다.

~cpp 
HRESULT GetAdapterDisplayMode(
  UINT Adapter,
  D3DDISPLAYMODE* pMode
);
인자는 위의것과 같다.

2. Checking For Compatible Formats

2.1. Checking Resource Formats

2.2. Checking Support


Retrieved from http://wiki.zeropage.org/wiki.php/2dInDirect3d/Chapter1
last modified 2021-02-07 05:22:14