^(코딩캣)^ = @"코딩"하는 고양이;

[단막 DirectX 9.0 활용] DirectX 9.0를 WM_PAINT 이벤트에 적용하기

API/DirectX
2019. 2. 26. 19:30

단막 DirectX 9.0 활용


 

DirectX 9.0를 WM_PAINT 이벤트에 적용하기


WM_PAINT(MFC: OnPaint) 이벤트는 창의 내용을 그릴 때 호출되는 이벤트이다. 이 이벤트에 DirectX 9.0을 적용하여 보겠다.

 

IDirect3DDevice9::TestCooperativeLevel


로스트 상태는, DirectX 객체와 실제 그래픽 어댑터 사이의 연결이 끊어진 상태를 뜻한다. DirectX 객체가 생성된 시점과 이 객체를 이용하여 실제로 그리는 시각 시점의 상대적으로 긴 시간이 있는 경우 이 사이에 여러가지 이유(예: 로그오프, 절전모드 등)로 객체와 장치간 연결이 끊어질 수 있는데 이는 IDirect3DDevice9::TestCooperativeLevel함수로 체크할 수 있다.

만일 DirectX와 장치간 연결이 정상이 아닐 경우 그 원인에 따라 D3DERR_DRIVERINTERNALERROR, D3DERR_DEVICELOST, D3DERR_DEVICENOTRESET 중 하나를 반환하는데, 이 때는 IDirect3DDevice9::CreateDevice에 사용되었던 D3DPRESENT_PARAMETERS 구조체를 다시 사용하여 IDirect3DDevice9::Reset 함수를 실행하여 장치와 객체의 연결을 리셋한다.

/* C++ Source */
IDirect3DDevice * pDirect3DDevice;
D3DPRESENT_PARAMETERS d3dPresentParameters;
HRESULT hResult;
// ...
hResult = pDirect3DDevice->TestCooperativeLevel();
switch (hResult)
{
case D3DERR_DRIVERINTERNALERROR:
    pDirect3DDevice->Reset(&d3dPresentParameters); // D3DPRESENT_PARAMETERS *
    // Reset 실패 시 각종 조치
    break;
case D3DERR_DEVICELOST:
    // Reset 실패 시 각종 조치
    pDirect3DDevice->Reset(&d3dPresentParameters); // D3DPRESENT_PARAMETERS *
    break;
case D3DERR_DEVICENOTRESET:
    // Reset 실패 시 각종 조치
    pDirect3DDevice->Reset(&d3dPresentParameters); // D3DPRESENT_PARAMETERS *
    break;
}

 

IDirect3DDevice9::Clear

장치의 로스트 상태 확인 및 조치를 완료하였다면 지정된 위치의 버퍼를 특정 색상으로 지운다.

/* C++ Source */
IDirect3DDevice * pDirect3DDevice;
D3DPRESENT_PARAMETERS d3dPresentParameters;
DWORD dwRects;
D3DRECT * pRects;

HRESULT hResult;
// ...
hResult = pDirect3DDevice->Clear
(
    0,                                // DWORD Count : pRects 배열의 원소 수
    NULL,                            // const D3DRECT * pRects
    D3DCLEAR_TARGET,                 //
    D3DCOLOR_XRGB(0x00, 0xFF, 0xFF), // D3DCOLOR Color : 리셋 후 버퍼의 색상
    0.0f,                            // float Z
    0                                // DWORD Stencil
);

if (FAILED(hResult))
{
    // Clear 실패 시 각종 조치
}

 

IDirect3DDevice9::BeginScene, IDirect3DDevice9::EndScene, IDirect3DDevice9::Present


그리기 단위인 '장면scene'을 시작하고, 끝내는 함수이고 IDirect3DDevice9::Present를 통해 버퍼 스왑을 한다.

/* C++ Source */
IDirect3DDevice * pDirect3DDevice;
D3DPRESENT_PARAMETERS d3dPresentParameters;
HRESULT hResult;
// ...
pDirect3DDevice->BeginScene();
if (FAILED(hResult))
{
    // BeginScene 실패 시 각종 조치
}

// 각종 그리기 연산

pDirect3DDevice->EndScene();
if (FAILED(hResult))
{
    // EndScene 실패 시 각종 조치
}

pDirect3DDevice->Present
(
    NULL, // const RECT * pSourceRect
    NULL, // const RECT * pDestRect
    NULL, // HWND hDestWindowOverride
    NULL  // const RGNDATA *pDirtyRegion
);

if (FAILED(hResult))
{
    // Present 실패 시 각종 조치
}

 

카테고리 “API/DirectX”
more...