stdafx.hDirectX Include
#include<d3dx9.h> #include <d3d9.h> #include <d3dx9.h> #pragma comment(lib, "d3d9") #ifdef _DEBUG #pragma comment(lib, "d3dx9d") #else #pragma comment(lib, "d3dx9") #endif↑ Stdafx.h 파일에 각 파일 포함하는 내용
1. View 클래스에 객체를 사용하기 위해 멤버변수를 등록
CXXXView.h객체 변수 선언
// 작업입니다. public: //DirectX 9 Var bool m_bComplete; //초기화 완료후 실제 DIRECTX 사용가능 플래그 (생성자에서 FALSE로 초기화) CRect m_rcClient; LPDIRECT3D9 m_pD3D; //D3D 디바이스를 생성할 D3D 객체변수 LPDIRECT3DDEVICE9 m_pd3dDevice; //렌더링에 사용될 D3D 디바이스
2. 객체의 초기화
CXXXView.cppView 생성자 객체 초기화
CXXXView::CXXXView()
{
// TODO: 여기에 생성 코드를 추가합니다.
this->m_bComplete = FALSE;
this->m_pD3D = NULL;
this->m_pd3dDevice = NULL;
}
3. 실제 Initialize -> OnInitialUpdate() 재정의하여 작성
CXXXView.cpp실제 Initialize 부분
void CXXXView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
// 디바이스 생성을 위한 D3D 객체 생성
{
AfxMessageBox(_T("D3D 객체 생성 실패"));
return;
}
//윈도우 싸이즈를 얻는다.
GetClientRect(&this->m_rcClient);
// 디바이스 생성을 위한 구조체
D3DPRESENT_PARAMETERS d3dpp;
// 반드시 구조체를 초기화 한후 사용
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE; //창모드
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //가장 효율적인 SWAP 효과
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // FPS 오류를 방지하기위해 무조건 그리기
d3dpp.BackBufferCount = 1; //백버퍼 개수 설정
d3dpp.BackBufferWidth = this->m_rcClient.Width();
d3dpp.BackBufferHeight = this->m_rcClient.Height();
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //바탕화면 사이즈의 후면버터 생성
// 실제 디바이스를 설정한다.
// 1 디폴트 비디오카드를 사용한다.
// 2 HAL 디바이스를 생성한다.
// 3 정점 처리를 모든 카드에서 지원하는 SW처리로 생성한다.
if(FAILED( this->m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,GetSafeHwnd(),D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&this->m_pd3dDevice) ))
{
AfxMessageBox(_T("D3D 디바이스 생성 실패"));
return;
}
this->m_bComplete = TRUE;
}
4. Render() 함수 구현 View -> 함수 추가하여 사용
CXXXView.cpp실제 렌더링 함수
// 렌더링 함수
void CEx1View::Render(void)
{
if(!this->m_pd3dDevice)
return;
//후면버퍼 클린 블랙으로 채움
this->m_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_RGBA(0,0,0,255),1.0f,0);
if(SUCCEEDED( this->m_pd3dDevice->BeginScene() ))
{
//실제 렌더링 명령수행
//렌더링 종료
this->m_pd3dDevice->EndScene();
}
//버퍼 전환
this->m_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}
5. 실제 호출 부분 구현 MFC에서는 App -> OnIdle 함수를 재정의하여 사용한다.
CXXX.cppCXXXApp 클래스의 OnIdle 를 재정의하여 사용
BOOL CEx1App::OnIdle(LONG lCount)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
CMainFrame *pFrame = (CMainFrame *) AfxGetMainWnd();
CEx1View *pView = (CEx1View *)pFrame->GetActiveView();
if(pView->m_bComplete)
{
pView->Render();
return TRUE;
}
//return CWinApp::OnIdle(lCount); // 무조건 TRUE를 리턴하여야. 에러가 안남.
}
6. 프로그램 종료시 객체의 소멸
CXXXView.cppView 클래스 PostNCDestroy 함수 재정의해서 사용
void CEx1View::PostNcDestroy()
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
// D3D객체의 CleanUP()
this->CleanUp();
CView::PostNcDestroy();
}
// D3D 객체 삭제
void CEx1View::CleanUp(void)
{
//객체 선언때와 반대로 늦게 할당한것부터 해제한다.
if(this->m_pd3dDevice)
this->m_pd3dDevice->Release();
if(this->m_pD3D)
this->m_pD3D->Release();
}
7. 만약 MFC에서 잔상이 남게되면 View 클래스에서 메세지 -> WM_ERASEBKGND 를 재정의한다.
CXXXView.cppWM_ERASEBKGND 재정의 사용
BOOL CEx1View::OnEraseBkgnd(CDC* pDC)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if(this->m_bComplete)
this->Render();
return false;
// return CView::OnEraseBkgnd(pDC);
}
내가 듣고싶은 음악
내가 들려주고싶은 음악

Category


Calendar


Recent Article


Recent Comment


Counter




