http://blog.naver.com/vane77/30005554405
SwapChains을 이용한 다중 분할 창
swapchain을 사용할 개수 만큼 HWND인 윈도우 핸들을 선언 한다.
HWND g_hwnd = NULL;HWND g_hwnd2 = NULL;LPDIRECT3DSWAPCHAIN9 chain1 = NULL;LPDIRECT3DSWAPCHAIN9 chain2 = NULL;
WinMain()
g_hwnd = CreateWindowEx( NULL,WINDOW_CLASSNAME, NULL,
WINDOW_STYLE2, 0, 10, 640, 480, NULL, NULL, hInstance, NULL);
g_hwnd2 = CreateWindowEx( NULL,WINDOW_CLASSNAME, NULL,
WINDOW_STYLE2, 639, 10, 640, 480, NULL, NULL, hInstance, NULL);ShowWindow(g_hwnd, SW_SHOW);UpdateWindow(g_hwnd);ShowWindow(g_hwnd2, SW_SHOW);UpdateWindow(g_hwnd2);
Init DirectX
Direct3D_Object->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hwnd,
VertexProcessing, &Present_Parameters, &D3D_Device)))// We create the first chain by simple calling GetSwapChain to get the default.
// Then we call CreateAdditionalSwapChain to create the second window's chain.
D3D_Device->GetSwapChain(0, &chain1);
D3D_Device->CreateAdditionalSwapChain(&Present_Parameters, &chain2);
Render1()chain1->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);D3D_Device->SetRenderTarget(0, pBackBuffer);BegineScene():EndScene()chain1->Present(NULL, NULL, g_hwnd, NULL, 0);Render2()chain2->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);D3D_Device->SetRenderTarget(0, pBackBuffer);BegineScene():EndScene()chain2->Present(NULL, NULL, g_hwnd2, NULL, 0);
http://www.cyworld.com/mustx/417
맵툴 만들다가... 다이얼로그에 미니맵을 띄우면 좋을 것 같아서;;
처음에는 다이얼로그를 폼뷰로 만들어 보고, 그냥 폼뷰를 붙일 수 있을까도 생각해 봤는데...
;; 그럴 필요가 없더군요.
일단 스왑체인 포인터를 준비해 두고..
LPDIRECT3DSWAPCHAIN m_pSwapMain;
LPDIRECT3DSWAPCHAIN m_pSwapMini;
그런데 한가지, 같은 창 내의 것이라면 구지 스왑체인 (분할 윈도우...)을 쓰지 않아도 되는 듯 합니다. 정확히 기억 나지 않지만... 아니라면 테클 환영;;;
메인용 디바이스 생성 파라매터는 CDirect3D라는 클래스로 일단 초기화...
이제 스왑 채인을 생성?? 해야 겠습니다.
D3DDISPLAYMODE d3ddm;
//일단 기본 정보를 CDirect3D클래스에서 뺴 돌립니다.
if(FAILED(m_pDirect3d->m_pD3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
{
return false;
}
//출력 파라메터에서 중요한 것이, 윈도우지정 부분입니다.
//첫번째 스왑 체인은 메인윈도우 디바이스에서 단순히 스왑체인을 얻어 오는 것이지만
//2번째는 생성? 개념으로 봐야 겠네요.. 그래서 출력할 다이얼로그의 윈도우 핸들 값을 넘겨 줍
//니다.
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = true;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.hDeviceWindow = m_pDlgMini->GetSafeHwnd();
//그 다음으로 디바이스에서 매인 스왑체인을 얻어오고, 거기에 추가 스왑체인?? 을
//생성합니다. 이때 넘겨줄 첫번째 인자로 위에서 지정한 present parameter가 됩니다.
m_pDirect3d->GetDevice()->GetSwapChain(0, &m_pSwap1);
m_pDirect3d->GetDevice()->CreateAdditionalSwapChain(&d3dpp, &m_pSwap2);
이제 Render부분 입니다.
여기서 한가지, 메인이라고 해서 그냥 Device를 이용해서 그리기를 하려고 하면;; 안 그려 지더군요... 그래서 보통 스왑체인 포인터를 2개 선언한것도 메인용과, 그에 따른 애디션 스왑체인을 생성하기 위한 것 같습니다.
//첫번째로 최종 렌더된 이미지가 뿌려질 버퍼를 얻어 와야 합니다.
LPDIRECT3DSURFACE9 pBackBuffer = NULL;
//스왑 체인에서 해당 백 버퍼를 얻어 옵니다.
m_pSwap1->GetBackBuffer( 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer );
//그리고 디바이스에서 최종적으로 뿌리게 될 타겟 버퍼를 아까 스왑 체인에서 얻어온 표면으로
//지정 합니다.
m_pD3ddev->SetRenderTarget( 0, pBackBuffer );
m_pD3ddev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xAAAAAAff, 1.0f, 0L);
m_pD3ddev->BeginScene();
// 드로우~~~!!
m_pD3ddev->EndScene();
//그리기가 끝나면 최종적으로 해당 표면에 뿌리는데, 이때 일반 디바이스의 Present함수의
//인자와 틀린것이 최종적으로 뿌리게 될 윈도우를 지정 하여야 한 다는 것입니다.
m_pSwap1->Present( NULL, NULL, m_mainWnd, NULL, 0 );
이제 미니맵으로 쓰이게 될 부분인데, 똑 같습니다;;;
m_pSwapMain을 m_pSwapMini로 바꿔주고, Present에서 타겟 윈도우(여기서는 다이얼로그)핸들을 지정해 주면 되는 것입니다.
m_mainWnd = AfxGetMainWnd()->GetSafeHwnd();
m_miniWnd = m_pDlgMini->GetSafeHwnd();
블로그 > 별 헤는 밤 비는 내리고
http://blog.naver.com/preknife/26829222
'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글
쿼드뷰 swapchain class 정리 (0) | 2012.11.02 |
---|---|
정점 압축[Vertex Component Packing 처리] (0) | 2012.11.02 |
MFC와 Directx 연동 (0) | 2012.11.01 |
블렌더 무료 (0) | 2012.10.31 |
에러 : the direct3d device has a non-zero reference count meaning some objects were not released (0) | 2012.10.31 |