모든 Direct3D 객체는 COM 객체이다(http://danac.tistory.com/37) 해당 객체는 사용자가 직접 new delete 하는것이 아니라 생성, 소멸 위한 별도의 함수가 존재한다고 하였다. IDirect3DDevice9 , IDirect3D9도 마찬가지. LPDIRECT3D9 g_pD3D; LPDIRECT3DDEVICE9 g_pD3DDevice; 우리가 객체를 이 순서로 생성을 했다. 그렇다면 해제는? g_pD3D로 g_pD3DDevice 를 만들었으니까 g_pD3DDevice가 아직 있는데 g_pD3D 가 없어지면 안되지 않을까? g_pD3DDevice->Release(); g_pD3D->Release(); 해당 순서로 Release 를 불러서 해제 해주면 된다. 좀더 안전하게 해..
버퍼 1개를 놓고 지웠다 그렸다 지웠다 그렸다 지웠다 그렸다 -> Flickering(깜박이는 현상) 발생! 따라서, 대부분의 게임, 혹은 실시간3차원 그래픽은 부드런 애니메이션위해 2개 이상의 화면 (buffer) 사용 우리가 내리는 모든 렌더 명령에 따라 대부분 후면 버퍼에 그린 후 특정한 명령을 내려 후면 버퍼를 보이는 화면인 전면버퍼로 전송하는 방식 이러한 2개 이상의 화면(또는 표면, 버퍼) 을 하나의컬렉션으로 관리하고 이를 스왑체인이라 부른다. cf) 스왑체인은 IDirect3DSwapChain9 인터페이스를 통해 이용가능, but 우리는 IDirect3DDevice9 객체를 이용해 그림을 그리고 버퍼교환 명령만 해주면 Direct3D 가 알아서 관리해준다. 따라서 우리가 해당 인터페이스 이용..
void Render( ) { if( NULL = g_pD3DDevice) //IDirect3DDevice9 가 없다면 그릴 수 없으므로 그냥 리턴한다. return; //후면버퍼 채우기 g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,255), 1.f, 0 ); if(SUCCEED(g_pD3DDevice->BeginScene())) //BeginScene 함수가 성공했다면 { //렌더 명령 //BeginScene의 Scene 을 끝낸다. g_pD3DDevice->EndScene( ); } //후면버퍼를 현재의 화면으로 g_pD3DDevice->Present(NULL,NULL,NULL,NULL); }
Presents the contents of the next buffer in the sequence of back buffers owned by the device. Syntax C++ HRESULT Present( [in] const RECT *pSourceRect, [in] const RECT *pDestRect, [in] HWND hDestWindowOverride, [in] const RGNDATA *pDirtyRegion ); Parameters pSourceRect [in] Type: const RECT* Pointer to a value that must be NULL unless the swap chain was created with D3DSWAPEFFECT_COPY. pSourceRe..
Ends a scene that was begun by calling IDirect3DDevice9::BeginScene. Syntax C++ HRESULT EndScene(); Parameters This method has no parameters. Return value Type: HRESULT If the method succeeds, the return value is D3D_OK. The method will fail with D3DERR_INVALIDCALL if IDirect3DDevice9::BeginScene is called while already in a IDirect3DDevice9::BeginScene/IDirect3DDevice9::EndScene pair. This happ..