일전에 MFC에서 WM_SIZE 이벤트를 핸들링하는 방법을 알아 보았었는데, 그 방법만 적용한다면, 원하는 결과를 얻을 수 없을 수도 있습니다.
그 이유는 LPDIRECT3DDEVICE9::Reset()이라는 함 수를 사용해서 디바이스를 재설정해주어야 하는데, 메모리릭등의 기타적인 이유로 리셋을 할 수 없는 경우가 존재합니다.
이 문제를, 명확하게 찾아 해결 하는 방법을 찾을 수가 없어, 다음과 같은 방법을 알게 되었다.
1. 모니터 해상도 사이즈 만큼의 백버퍼 사이즈를 설정한다.
2-1. 윈도우 사이즈 크기로 뷰포트를 생성한다.
2-2. 트렌젝션 행렬을 계산한다.
3. Device Present때 윈도우 사이즈를 인자로 넘겨 준다.
void setDisplay( CRect rcClient, HWND hDevice, HWND hFocus )
{
HRESULT hr;
m_Rect = rcClient;
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
D3DDISPLAYMODE d3ddm;
m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );
...
m_d3dpp.BackBufferWidth = GetSystemMetrics( SM_CXSCREEN );
m_d3dpp.BackBufferHeight = GetSystemMetrics( SM_CYSCREEN );
...
D3DVIEWPORT9 viewport = { 0, 0, m_Rect.Width(), m_Rect.Height(), 0, 1 };
m_pd3dDevice->SetViewport( &viewport );
m_MainCamera->SetCamera( m_Rect.Width(), m_Rect.Height() );
m_MainCamera->setPosition( D3DXVECTOR3( 0, 10, -50 ) );
}
void setDisplayResize( int cx, int cy )
{
if( m_pd3dDevice )
{
boost::mutex::scoped_lock lock( thead_io_lock );
D3DVIEWPORT9 vp = { 0, 0, cx, cy, 0, 1 };
m_pd3dDevice->SetViewport( &vp );
m_MainCamera->SetCamera( cx, cy );
m_AdditionCamera->SetCamera(cx - 295, cy - 295);
}
m_Rect = CRect( 0, 0, cx, cy );
}
void Render()
{
...
hr = m_pd3dDevice->Present( &m_Rect, &m_Rect, 0, 0 );
...
}
고맙다. 친구야.
'MISCELLANEOUSNESS' 카테고리의 다른 글
가스킷 그리기 (0) | 2010.03.11 |
---|---|
Game Engine Architecture and Nvidia PhysX (0) | 2010.02.20 |
error LNK2005: "class _variant_t vtMissing" (0) | 2010.02.20 |