📂기초 및 세팅 note/2D & 3D
DX: 기초이론(2)
MTG
2011. 10. 18. 20:45
* 이 포스트는 메모용으로 차후에도 내용이 변경될수 있으므로, 링크스크랩만 허용합니다.
1. DX 초기화
2. 그래픽 카드
3. 기타 초기화 & 게임프로그래밍 루프
4. Lost Device
1. DX 초기화
① DirectX Library의 설치 여부검사 및 장치 인터페이스 포인터 얻기
-> 매우 간단g하게 IDirect3D9 인터페이스의 포인터를 얻는다.
즉 Direct3D에 접근 가능한 포인터를 얻는 것이다. 일단 이 포인터를 통해 아래 장치 성능을 확인할 수 있다.
② D3DCAPS9을 통한 장치 성능 확인
③ 화면 크기/동작 모드 등 설정
-> D3DPRESENT_PARAMETERS 구조체의 값 설정
④ D3DPRESENT_PARAMETERS를 통한 IDirect3DDevice9 객체 생성
//-----------------초기화 시작 절차-----------------
IDirect3D9 *D3D=NULL;
D3D = Direct3DCreate9( D3D_SDK_VERSION);
if(!D3D) {
//Handle error : 시스템에서 Direct3D 기능을 지원하지 못 함
// 오류를 내보내고 프로그램을 종료시킨다
}
//초기화 시작 절차 완료
//-----------------종료 절차 시작-----------------
// 어플리케이션 프로그램 종료시 사용되는 코드
If(D3D)
{
D3D->Release();
D3D=NULL;
}
//-----------------종료 절차 완료-----------------
2. 그래픽 카드
① 하드웨어 정점 처리 능력의 확인
-> 다음 함수의 호출을 통해 성능을 확인할 수 있다
HRESULT GetDeviceCaps
(
UINT Adapter, // 사용할 그래픽 카드의 번호 지정
D3DDEVTYPE DeviceType, // D3DDEVTYPE_HAL과 같은 형식 확인
D3DCAPS9 *pCaps // 결과값을 리턴 받을 구조체 포인터 변수
);
② 그래픽 카드의 지원 능력 확인
HRESULT CheckDeviceType(
UINT Adapter, // 사용할 그래픽 카드의 번호 지정
D3DDEVTYPE DeviceType, // D3DDEVTYPE_HAL과 같은 형식 확인
D3DFORMAT DisplayFormat, // 디스플레이 픽셀 포맷(색상수)
D3DFORMAT BackBufferFormat, // 위의 DisplayFormat과 동일
BOOL Windowed // Full Screen 또는 Windowed 모드 취사 선택
);
Example
IDirect3D9 *d3d=NULL;
d3d = Direct3DCreate9( D3D_SDK_VERSION);
HRESULT hr;
hr=d3d->CheckDeviceType
(
D3DADAPTER_DEFAULT, // Adapter 번호 상수
D3DDEVTYPE_HAL, // DeviceType
D3DFMT_R5G6B5, // DisplayFormat
D3DFMT_R5G6B5, // BackBufferFormat
false // Windowed
);
if(SUCCEEDED(hr))
{
// 해당하는 설정을 지원함
}
else{
// 본 설정을 지원하지 못함. 오류를 내고 프로그램을 종료시킴
}
③ 모니터의 화면 재생 방식
-> Refresh Rate : 스크린의 화면 갱신 주기 (60HZ = 60번갱신/1초)
-> Vertical retrace period : 순차적으로 좌에서 우 / 상단에서 하단으로 갱신.
브라운관 모니터때 방식이나 LCD류에서도 관용적으로 사용
화면찢김을 방지키 위해 VSYNC(Vertical Sync)기능 필요.
-> SWAP Chain : 2장 이상의 그래픽 메모리 버퍼가 교대로 화면을 띄워준다.
즉, n(>=2)인 버퍼가 교대로 화면전체를 출력
④ Buffer Formats은 상수로 정의되어 있다
-> 최대 24비트 형식으로 표현되나, DirectX에서는 BackBuffer에 대한 메모리 처리 단위가 16 또는 32 비트로 처리
D3DFMT_X8R8G8B8 // 32-bit RGB pixel format, 총 32비트중 X8( = 8비트만큼 안 쓴다 )처리.
D3DFMT_R5G6B5 // 16-bit RGB pixel format with 5 bits for red, 6 bits for green, and 5 bits for blue.
D3DFMT_X1R5G5B5 // 16-bit pixel format where 5 bits are reserved for each color.
D3DFMT_A1R5G5B5 // 16-bit pixel format where 5 bits are reserved for each color and 1 bit is reserved for alpha.
⑤ D3DPRESENT_PARAMETERS 구조체 설정
-> 잘 모르겠으면 각 구조체 변수 값을 설정하지 말고, Default 값으로 활용한다.
D3DPRESENT_PARAMETERS pp;
ZeroMemory( &pp, sizeof(pp) ); // 구조체 값 초기화( 0 으로 )
pp.hDeviceWindow=wnd; // 그림을 그릴 윈도우 창을 지정한다
pp.Windowed = TRUE; // 창 모드로 연다
pp.SwapEffect = D3DSWAPEFFECT_DISCARD; // 그냥 되는데로 화면을 갱신한다
pp.BackBufferFormat = D3DFMT_UNKNOWN; // 창 모드. 기존 윈도우 데스크탑 화면형식을 따른다
3. 기타 초기화 & 게임프로그래밍 루프
① API프로그래밍과 달리 게임프로그래밍은 윈도우 핸들러에서
while( WM_QUIT != msg.message )로 종료직전까진 루프가 계속 돌아가게 해야한다.
② WinMain()의 처리 순서도D3d::InitD3D // Direct3D 초기화, 해상도 등 지정Setup() // 사용자 객체의 초기화 D3D::EnterMsgLoop() // 메시지 루프는 강제 종료까지 무한히 반복Cleanup() // 사용자 객체의 종료Devicerelease // Direct3D 객체 해제
③ 그래픽 처리 3단계
Device→Clear // 먼저 화면을 지운다
(Drawing) // 그림을 그린다
Device→Present // 화면을 표시한다(Swap 방식에 의해서)
4. Lost Device
① 원리
-> Full Screen Mode에서 ALT+TAB을 눌러 Task를 전환하면,
윈도우는 자동적으로 응용 프로그램에 대한 전환 처리를 시행.
이때 다시 ALT+TAB을 눌러 원래의 3D 어플리케이션 복구하려면 오류가 발생된다.
이 원인은 3D 카드의 설정이 최초 ALT+TAB시 비 Direct3D 응용 프로그램을 위해 설정 변화가 일어났기 때문
② 대책
-> 어플리케이션에서 현재 그래픽 카드의 상태를 확인하고 있다가, 복구시점에서 Device를 Reset하면 된다
③ 복구검사
IDirect3DDevice::TestCooperativeLevel()을 호출하여, 디바이스를 복구 할 수 있는지 검사
-> 반환값(HRESULT)이 D3DERR_DEVICELOST인 경우 디바이스가 소실되었고 아직 복구할 수 없는 상태.
복구할 수 있을 때 까지 대기한다.
-> D3DERR_DEVICENOTRESET인 경우 디바이스가 소실되지만 지금 복구할 수 있는 상태이다. 디바이스를 복구한다.
④ 복구절차
-> D3DPOOL_DEFAULT로 잡은 리소스들을 전부 릴리즈한다.
(안그러면 다음에 호출될 IDirect3DDevice::Reset()이 실패할것이다)
-> IDirect3DDevice::Reset()을 호출한다.
(Reset()을 그냥 IDirect3DDevice의 복구 명령어라 생각하면 이해가 편함)
-> 디바이스를 다시 셋팅한다.
(랜더스테이트, 뷰 행렬 등..)
-> D3DPOOL_DEFAULT로 잡은 리소스들을 다시 로드한다.