티스토리 뷰
Direct3D 의 시작 장치만들기 IDirect3DDevice9 , IDirect3D9 (COM 객체)
몰라아 2017. 6. 17. 20:49Direct3D를 이용하기 위해서는 두가지 객체가 필요하다.
일단 3D 그래픽에 관련된 일을 해주는 하드웨어 장치가 있어야 하고
컴퓨터의 상황에 맞추어 앞서말한 하드웨어 장치를 만들어주는 장시가 있어야 한다.
LPDIRECT3D9 g_pD3D;
Create Microsoft Direct3D objects and set up the environment. This interface includes methods for enumerating and retrieving capabilities of the device.
시스템의 물리적 하드웨어 장치에 대한 정보를 얻고 , 원하는 조건에 따라, 하드웨어 성능에 따라 IDirect3DDevice9 객체 생성해주는애
LPDIRECT3DDEVICE9 g_pD3DDevice;
Perform DrawPrimitive-based rendering, create resources, work with system-level variables, adjust gamma ramp levels, work with palettes, and create shaders.
3D 그래픽 디스플레이에 이용하는 물리적 하드웨어 장치를 나타내는 c++객체
IDirect3D9, IDirect3DDevice9 interface inherit from the IUnknown interface.
둘 모두 COM 객체이기 때문에 직접 new 함으로써 생성할 수 없고 생성을 위한 특정 함수가 있다.
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;
HRESULT CreateD3D()
{
if(FAILED( m_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
/* Direct3D9 인터페이스의 포인터를 얻는다.
이 함수의 단일인자에는 항상 D3D_SDK_VERSION을 전달해야한다.
이 인자는 애플리케이션이 올바른 헤더 파일로 만들어졌음을 확인하기 위한 것이다.
만약 함수가 실패하면 NULL을 리턴한다.
해당 객체는 장치검증과 IDirect3DDevice9 객체 생성의 두 가지 용도로 이용된다.
장치 검증은 기능, 디스플레이 모드, 포맷 등과 같이 시스템의 그래픽 장치가
제공하는 특성에 대한 정보를 얻는 과정이다.
예를 들어 물리적 장치를 나타내는 Direct3DDevice9 객체를 만들기 위해서는
물리 장치가 지원하는 디스플레이 모드와 포맷을 이용해야 하며 이와 같은
작업환경설정을 얻기 위해서는 Direct3D9 열거형 메서드를 이용해야 한다.
장치 검증에 대해서는 많은 설명 필요하므로 생략.... */
//이렇게 Create - 함수들을 불러주면 내부에서 AddRef() 함수를 작동시켜 알아서 생성 해준다.
D3DCAPS9 stCaps;
int nVertexProcessing;
//하드웨어 버텍스 프로세싱을 지원하는지 하지 않는지 얻어온 결과에대한 정보 담을 변수
//bool nVertexProcessing= false; 0과 1의 값이 들어갈것이므로 이 변수로도 가능
m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &stCaps);
/*
Direct3DDevice9 인터페이스를 만들기 위해서는 하드웨어 지원 여부를 먼저 확인해야 한다.
디스플레이 어댑터(기본 그래픽 카드) 가 하드웨어 버텍스 프로세싱을 지원하는지
알아보기 위해 장치특성을확인한다.(D3DCAPS9)
*/
if (stCaps.DevCaps& D3DDEVCAPS_HWTRANSFORMANDLIGHT)
nVertexProcessing = D3DCREATE_HARDWARE_VERTEXPROCESSING; //지원한다.
else
nVertexProcessing = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //지원하지 않느다.
D3DPRESENT_PARAMETERS stD3DPP;
ZeroMemory(&stD3DPP, sizeof(D3DPRESENT_PARAMETERS)); //0으로
stD3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
stD3DPP.Windowed = TRUE; //창모드 생성
stD3DPP.BackBufferFormat = D3DFMT_UNKNOWN; //현재 바탕화면 모드에 맞춰 생성
stD3DPP.EnableAutoDepthStencil = TRUE; //D3D가 자동으로 깊이, 스텐실 버퍼 만들도록
stD3DPP.AutoDepthStencilFormat = D3DFMT_D16;
/*
이제 우리가 만들어야 하는 Direct3D9Device 인스턴스의 특성을 지정하기 위한
몇 가지 데이터 멤버들을 포함하는 D3DPRESENT_PARAMETERS구조체 인스턴스를
초기화한다.
D3DPRESENT_PARAMETERS 구조체는 다음과같은 멤버들을 가지고있다.
typedef struct _D3DPRESENT_PARAMETERS_
{
UINT BackBufferWidth; //픽셀 단위의 후면 버퍼 너비
UINT BackBufferHeight; //픽셀 단위 후면 버퍼 높이
D3DFORMAT BackBufferFormat; //후면 버퍼 픽셀 포맷
UINT BackBufferCount; //이용할 후면 버퍼 수(보통1)
D3DMULTISAMPLE_TYPE MultiSampleType; //후면 버퍼에 이용할 멀티 샘플링의 타입
DWORD MultiSampleQuality; //멀티 샘플링 레벨
D3DSWAPEFFECT SwapEffect; //플리핑 체인 버퍼가 교환되는 방법을 지정하는 D3DWQAPEFFECT
//열거형 멤버 . D3DSWAPEFFECT_DISCARD를 지정하는것이 가장 효과적
HWND hDeviceWindow; //서비스와 연결되는 윈도우 핸들, 드로잉의 대상이 될 애플리케이션 윈도우 지정
BOOL Windowed; //윈도우 모드로 실행중일 때는 true 전체 화면모드 실행중일 때는 false 지정
BOOL EnableAutoDepthStencil; //D3D가 자동으로 깊이/ 스텐실 버퍼를 만들고 관리하길 원한다면 true 지정
D3DFORMAT AutoDepthStencilFormat; //깊이/ 스텐실 버퍼의 포맷
DWORD Flags; //몇 가지 부가적인 특성들 0 을지정하거나 D3DPRESENTFLAG
//집합의 멤버중 하나를 지ㅓㅇ한다.
// FullScreen_RefreshRateInHz must be zero for Windowed mode
UINT FullScreen_RefreshRateInHz; //재생율
UINT PresentationInterval; //D3DPRESENT 집합의 멤버 선택가능한 전체 간격 리스트는
//SDK 문서를 참고한다.
} D3DPRESENT_PARAMETERS;
*/
/*
드디어 3D 그래픽 디스플레이에 이용될 물리 하드웨어 장치를 나타내는
c++ 객체인 Direct3DDevice9 객체를 생성할 수 있게 되었다.
*/
if(FAILED( m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, //기본 어댑터(디바이스 생성할 화면의 순서번호
// 모니터가 한 개 이상인경우)
D3DDEVTYPE_HAL, //장치 타입(D3D
g_hWnd, //
nVertexProcessing,
&stD3DPP,
&m_pD3DDevice))) //생성할장치
return E_FAIL;
/*
현재는 3D 그래픽 드로잉에 기본 디스플레이 어댑터를 이용한다는것을 기억하자.
두 개 이상의 그래픽 카드를 이용중이라면 현재 이용되고있는 카드(현재 윈도우 데탑을 디스플레이 하는 그래픽카드)
가 기본 디스플레이 어댑터이다.
*/
/*
CreateDevice(THIS_ UINT Adapter, //디바이스를 생성할 화면의 순서번호 / 모니터가 한 대이상인 경우에만 해당.
D3DADAPTER_DEFAULT 는 기본 화면을 나타낸다
D3DDEVTYPE DeviceType, //출력 디바이스의 종류 결정 D3DDEVTYPE_HAL, D3DDEVTYPE_SW, D3DDEVTYPE_REF 가 있는데
이중 D3DDEVTYPE_HAL이 하드웨어 가속 지원하는 디바이스
HWND hFocusWindow, //디바이스가 출력할 윈도우의 핸들 ,
전체 화면모드일 경우 최상위 윈도우(부모가 없는 윈도우)만 가능
DWORD BehaviorFlags, //D3D9의 가장 강력한 기능인 셰이더를 지원할 때 하드웨어 가속 사용할건지, 소프트에어적 지원할것인지 결정
D3DCREATE_HARDWARE_VERTEXPROCESSING/ D3DCREATE_SOFTWARE_VERTEXPROCESSING이 가장 중요
D3DPRESENT_PARAMETERS* pPresentationParameters, //앞에서 선언한 D3DPRESENT_PARAMETERS구조체 포인터
IDirect3DDevice9** ppReturnedDeviceInterface); //IDirect3DDevice9 의 인터페이스를 갖고 있는 포인터가 담겨 돌아옴
*/
/*
각각의 인자마다 선택가능한 값의 종류가 다양하다.
정확한 값이 들어가지 않고 적당히 값을 넣을 경우 디바이스가 생성되지 않느다.
예를 들얼 NVIDIA의 GeForce2기종은 하드웨어 셰이더를 지원하지 않으므로 D3DCREATE_HARDWARE_VERTEXPROCESSING 같은
전달인자를 사용할 경우 디바이스가 생성되지 않는다. 따라서 전달인자의 의미르 ㄹ각각 명확하게 알고 있어야 한다.
*/
}
Direct3D 를 이용한 3D 게임프로그래밍 책 참고
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ff471470(v=vs.85).aspx
https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb174300(v=vs.85).aspxhttps://msdn.microsoft.com/ko-kr/library/windows/desktop/bb174336(v=vs.85).aspx
'ComComComCom > DX .. D3D' 카테고리의 다른 글
후면 추려내지 않기 (백페이스 컬링(back face culling) 관련) (0) | 2017.06.18 |
---|---|
[function] IDirect3DDevice9::SetRenderState (0) | 2017.06.17 |
com 객체인 IDirect3DDevice9 , IDirect3D9 해제하기 (0) | 2017.06.17 |
렌더링 기술 스왑 체인을 이용한 페이지 플리핑 (0) | 2017.06.17 |
[function] IDirect3DDevice9::Present (0) | 2017.06.17 |