반응형

http://blog.naver.com/vane77/30005554405


첨부파일 (1)

SwapChains을 이용한 다중 분할 창

 


 
 
 

swapchain을 사용할 개수 만큼 HWND인 윈도우 핸들을 선언 한다.
HWND g_hwnd = NULL;
HWND g_hwnd2 = NULL;
 
LPDIRECT3DSWAPCHAIN9 chain1 = NULL;
LPDIRECT3DSWAPCHAIN9 chain2 = NULL;
 

  
WinMain()
각각의 핸들은 CreateWindowEX 팝업창을 생성하고 등록 절차를 마친다.
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
DirectX객체 생성후 Device 생성 시점에 대표(?)가 되는 핸들을 이용하여 생성한다.
GetSwapChain으로 지정된 스왑체인을 CreateAdditionalSwapChain()으로 다른창 내용에
들어갈 chain2에 copy 한다.
 
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);
 
Render()를 호출 하기전에 각각의 분할창에 대해 스홥 체인을 바꿔가면서 렌더링을 걸어준다.  
  
  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);
 
다중 분할창을 구현 하는 방법에 대해서 간단히 적어 보았습니다.
(참고로 제가 변경한 소스내용은 지저분합니다.)
아래 사이트 주소를 남겨 놓았으니 원본 소스를 참고하십시오.
DirectX Tutorial이 잘 되어 있습니다.
 
 
References
 
 



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

 

 




반응형

+ Recent posts