본문 바로가기
  • fishing...
  • eating...
MISCELLANEOUSNESS

D3D] MFC - DirectX

by 회색뿔 2010. 2. 28.


일전에 올렸던 글에 대한 추가 적인 내용을 다룬 포스팅입니다.

일전에 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