반응형

SwapChain에대해서 아직 좀 궁금한게 많아서 이리저리 뒤적거리다
우연히 발견한 내용...


---주의점 (퍼옴)---


1. 기본 device는 첫번째 체인이다.

ex)   pd3dDevice->GetSwapChain(0, &l_pSwpChain1);

2. 추가 창에 swapchain을 적용시킬 경우 체인을 추가시켜준다.

ex)
 ZeroMemory(&l_d3dpp, sizeof(D3DPRESENT_PARAMETERS) );
 D3DDISPLAYMODE mode;
 DXUTGetD3DObject()->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &mode);

 l_d3dpp.BackBufferWidth = 0;
 l_d3dpp.BackBufferHeight = 0;
 l_d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
 l_d3dpp.Windowed = TRUE;
 l_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
 l_d3dpp.BackBufferFormat = mode.Format;
 l_d3dpp.hDeviceWindow = l_cDlgPicView.m_hWnd;
 l_d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;

 pd3dDevice->CreateAdditionalSwapChain( &l_d3dpp, &l_pSwpChain2 );


3. 체인을 쓸 경우 기본 체인에도 꼭 백버퍼 설정을 해줘야 한다.

ex)
 LPDIRECT3DSURFACE9 pSurface = NULL;

 pd3dDevice->GetSwapChain(0, &l_pSwpChain1);
 l_pSwpChain1->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
 pd3dDevice->SetRenderTarget(0, pSurface);


4. 체인 렌더 시 BeginScene() 과 EndScene() 안에서 실행한다.
   그리고 한 체인의 렌더가 끝났으면 백버퍼를 릴리즈 시킨다.

ex)
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {
          ...
          pd3dDevice 를 이용하여 render
          ...

          pSurface->Release();
          pd3dDevice->EndScene();
    }


5. 뷰포트를 얻을 때, 마지막 설정된 디바이스 체인의 뷰포트를 가져온다.

6. SwapChain생성 시 D3DPRESENT_PARAMETERS::SwapEffect 항목으로
   그나마 최적화를 할 수 있다.

ex) D3DSWAPEFFECT_DISCARD, D3DSWAPEFFECT_COPY, D3DSWAPEFFECT_FLIP


7. 서로 전혀 상관되지 않는 무언가를 보여줄 시엔 device를 새로 생성하는 편이 낫다.

ex) 맥스의 분할화면 ( SwapChain ), 텍스쳐 미리보기 창 ( Device 새로 생성 )


8. 이 많은 주의사항을 알려주는 곳이 전무했다.  젠장!
   이라고 원본 글쓴분께서 말하셨다....

반응형

+ Recent posts