카테고리 Archives: C++

[DX9] 1.디바이스의 작성 4 – 신의 렌더링과 표시

신을 렌더링해 표시하기 위해 이번 샘플 코드에서는 백 버퍼를 청색으로 클리어해서 백 버퍼의 내용을 프론트 버퍼로 전송해 프론트 버퍼를 화면에 할당합니다.

신을 클리어하려면 IDirect3DDevice9::Clear 메소드를 호출합니다.

// Clear the back buffer to a blue color
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

IDirect3DDevice9::Clear 가 받아들인 최초 2개의 파라메터는 Direct3D에 클리어할 사각형(矩形;rect)의 배열의 사이즈와 어드레스를 통지합니다. 사각형의 배열은 클리어할 렌더 타겟 서페이스 상의 영역을 나타내고 있습니다.

일반적으로 렌더 타겟 전체를 커버하는 단일 사각형을 사용합니다. 이것을 실행하려면 첫번째의 파라메터를 0으로, 두번째의 파라메터를 NULL로 설정합니다. 세번째 파라메터는 메소드의 동작을 결정합니다. 렌더 타겟 서페이스(render-target suface), 관련지어진 심도 버퍼(associated depth buffer), 스텐실 버퍼(stencil buffer), 또는 3개의 임의의 조합을 클리어하기 위한 플래그를 지정할 수 있습니다. 이 튜토리얼에서는 심도 버퍼는 사용하지 않습니다. D3DCLEAR_TARGET 이 사용되고 있는 유일한 플래그입니다. 최초 3개의 파라메터는 렌더 타겟, 심도 버퍼, 그리고 스텐실 버퍼의 값의 클리어를 반영하도록 설정됩니다. CreateDevice 샘플 프로젝트에서는 렌더 타겟 서페이스의 클리어 컬러를 청(D3COLOR_XRGB(0,0,255))으로 설정합니다. 마지막 2개의 파라메터는 대응하는 플래그가 존재하지 않으므로 IDirect3DDevice9::Clear 메소드에서는 무시됩니다.

다음의 샘플 코드에 보이는 것처럼 CreateDevice 샘플 프로젝트는 뷰포트를 클리어한 후, Direct3D에 렌더링이 개시된 것을 통지하고 그 뒤 렌더링이 완료된 것을 통지합니다.

// Begin the scene
g_pd3dDevice->BeginScene();

// Rendering of scene objects happens here

// End the scene
g_pd3dDevice->EndScene();

IDirect3DDevice9::BeginScene 과 ID3DXRenderToSurface::EndScene 메소드는 렌더링의 개시 또는 완료를 통지합니다. 이들 메소드를 호출하는 사이에서만 렌더링 메소드를 호출 할 수있습니다. 렌더링 메소드가 실패한 경우에도, 다시 IDirect3DDevice9::BeginScene 를 호출하기 전에 ID3DXRenderToSurface::EndScene 를 호출할 필요가 있습니다.

신이 렌더링되면 IDirect3DDevice9::Present 메소드를 사용해 표시합니다.

g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

최초 2개의 파라메터는 복사할(source) 사각형과 복사될(destination) 사각형입니다. 이 샘플 코드에서는 이 2개의 파라메터를 NULL에 설정하는 것으로 백 버퍼 전체를 프론트 버퍼에 할당하고 있습니다. 3번째 파라메터는 이 프레젠테이션의 소스 윈도우를 설정합니다. 이 파라메터는 NULL에 설정되어있으므로 D3DPRESENT_PARAMETERS의 hWndDeviceWindow 멤버가 사용됩니다. 4번째의 파라메터는 DirtyRegion 파라메터로 일반적으로는 NULL에 설정됩니다.

이 튜토리얼의 마지막 단계로「5 – 셧 다운」에서 애플리케이션을 셧다운 해 봅시다.

[DX9] 1.디바이스의 작성 3 – 시스템 메시지 처리

애플리케이션 윈도우를 작성하고, Direct3D를 초기화 한 후는 언제라도 신을 렌더링 할 수 있습니다. 통상, Windows 애플리케이션은 각각의 메시지 루프 내에서 시스템 메시지를 모니터하고, 메시지가 큐에 존재하지 않으면 프레임을 렌더링 합니다. 다만, CreateDevice 샘플 프로젝트는 WM_PAINT 메시지가 큐에 들어올 때까지 대기해 애플리케이션에 그 윈도우 전체 또는 일부를 갱신할 필요가 있음을 통지합니다.

// The message loop.
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

루프가 실행될 때마다 DispatchMessage 는 큐 내의 메시지를 처리할 MsgProc를 호출합니다.
WM_PAINT 가 큐에 들어오면 애플리케이션은 윈도우를 갱신할 애플ㄹ리케이션 정의 함수인 Render를 호출합니다. 이어서 클라이언트 영역 전체를 검증하기위해서 Win32함수ValidateRect 가 불립니다.

메시지 처리 함수의 샘플 코드는 다음과 같습니다.

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

이것으로 애플리케이션은 시스템 메시지를 처리할 수 있습니다. 다음에는 「 4 – 신의 렌더링과 표시」에서 설명하는 것 처럼 표시를 렌더링 합니다.

© 2009 Microsoft Corporation. All rights reserved.
バージョン: 1734.00