1.2. Purpose of the IDirect3D8 Object ¶
이것을 만드는 이유는 간단하다. IDirect3DDevice8 객체를 만들기 위해서는 "꼭" 필요하기 때문에 만든다. 이 객체에서는 실질적인 작업보다는 초기화를 도와주는 역할을 주로 한다.
1.3. Creating IDirect3D8 Object ¶
그럼 실제로 만들어보자. 만들때에는 다음 함수가 필요하다.
~cpp IDirect3D8* Direct3DCreate8 ( UINT SDKVersion; );
~cpp IDirect3D8* pd3d = NULL; // 포인터를 한개 만들어서 pd3d = Direct3DCreate8( D3D_SDK_VERSION ); // 이렇게 생성한다. ///// 해제할때는 이렇게 if( pd3d ) { pd3d->Release(); pd3d = NULL; }
1.4.1. Adapter ¶
설마 그래픽카드(Adapter)를 여러개 다는 집은 흔하지 않을 거라 생각하지만, 만일의 사태를 대비해서 모두 만들어 두었다
~cpp UINT IDirect3D8::GetAdapterCount();
- RET 몇개의 어댑터가 있는지 알려준다. 1개가 있으면 1, 2개가 있으면 2다.
어댑터에는 모두 번호가 붙어있다. 첫번째 어댑터에는 0, 두번째 어댑터에는 1, 이런 식이다. 0은 기본으로 있기 때문에 매크로로도 만들어져 있다. D3DADAPTER_DEFAULT 매크로이다. 0번 어댑터를 기본 어댑터라고도 한다.
그 어댑터는 어떤 상태일까
~cpp HRESULT GetAdapterIdentifier { UINT Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER8* pIdentifier };
- RET HRESULT형의 값을 리턴한다. 성공하면 D3D_OK, 실패하면 D3D_INVALIDCALL이 나온다.
- IN 첫번째 인자는, 어댑터의 번호이다. 당연히 D3DADAPTER_DEFAULT를 넣어준다.
- IN 두번째 인자는 플래그이다. 0이나 D3D_ENUM_NO_WHQL_LEVEL을 넣을 수 있지만, 대개 0을 넣는다.
- OUT 세번째 인자를 출력값이다. 그곳의 멤버 변수는 다음과 같다.
~cpp Driver : 드라이버의 이름 Description : 어댑터의 설명 DriverVersion : 드라이버의 버전 VendorID, DeviceID, SubSysID, Revision : 칩셋마다 틀려요 DeviceIdentifier : 드라이버나 어댑터를 위한 GUID(?) WHQLLevel : 인증날짜
1.6.1. Looking at Adapter Display Modes ¶
실행자의 어댑터가 어떤 모드를 표시할 수 있는지 알아보자. 먼저 몇가지 모드를 표시할 수 있는지 알아보자
~cpp UINT IDirect3D8::GetAdapterModeCount( UINT Adapter; );
- Adapter에는 어댑터의 번호(D3DADAPTER_DEFAULT)를 넣는다. 리턴값은 표시할 수 있는 모드의 개수
어떤 모드가 어떻게 표시하는지를 알아보려면
~cpp HRESULT IDirect3D8::EnumAdapterModes( UINT Adapter, UINT Mode, D3DDISPLAYMODE* pMode );
- Adapter에는 어댑터의 번호를, Mode에는 표시할 모드의 번호(0 ~ GetAdapterModeCount() - 1의 범위)를 넣는다.
- pMode에 그 모드의 정보가 나온다.
~cpp Width : 가로폭 Height : 세로폭 RefreshRate : 주사율 Format : 포맷(앞쪽에 나왔던)