DirectX Graphics 프로그래밍 가이드 튜토리얼, 샘플, 툴, 힌트 샘플 샘플 프레임워크(framework)   [목차열람] [주소복사] [슬롯비우기]
샘플 프레임워크(framework)
 
Microsoft DirectX 9.0

샘플 프레임워크(framework)


Microsoft® DirectX® 9.0 및 Microsoft Direct3D® 소프트웨어 개발 킷 (SDK)의 그래픽스 샘플 프레임워크(framework)는, DirectX 8.0 의 그래픽스 샘플 프레임워크(framework)로부터 발전한 것이다. SDK 의 샘플은, 디폴트로 (SDK 루트) \Samples\C++ 에 인스톨 된다. 여기서 주목하는 폴더는 Common 와 Direct3D 이다. Common 폴더에는 샘플 프레임워크(framework)가 들어가 있다. Direct3D 폴더에는, 이러한 그래픽스 프레임워크(framework)에 근거하는 Direct3D 샘플이 들어가 있다.

그래픽스 프레임워크(framework)는, 5 개의 소스 모듈로부터 구성되어 있다.

대응하는 헤더 파일은 (SDK 루트) \Samples\C++\Common\Include 폴더에 있다.

각 샘플은, CD3DApplication 의 서브 클래스 (일반적으로 CMyD3DApplication 라고 명명된다)와 다음에 나타내는 일련의 오버라이드(override) 가능한 메서드를 처리 한다.

// Overridable functions for the 3-D scene created by the application.
virtual HRESULT ConfirmDevice(D3DCAPS9*, DWORD, D3DFORMAT)   { return S_OK; }
virtual HRESULT OneTimeSceneInit()                         { return S_OK; }
virtual HRESULT InitDeviceObjects()                        { return S_OK; }
virtual HRESULT RestoreDeviceObjects()                     { return S_OK; }
virtual HRESULT FrameMove()                                { return S_OK; }
virtual HRESULT Render()                                   { return S_OK; }
virtual HRESULT InvalidateDeviceObjects()                  { return S_OK; }
virtual HRESULT DeleteDeviceObjects()                      { return S_OK; }
virtual HRESULT FinalCleanup()                             { return S_OK; }

/*
    The prototypes for these methods are contained in D3dapp.h in the
    CD3Dapplication class.  The samples create a new 
    application and override those methods that are needed by the
    application.
*/

상속 클래스의 예

이 예에서는, 오버라이드(override) 가능한 메서드의 서브 세트를 사용한다. 클래스 CMyD3DApplication 는, 다음의 메서드를 포함하고 있다. 다음에, 이 각 메서드에 대해 설명한다.

class CMyD3DApplication : public CD3DApplication
{
public:
    CMyD3DApplication();
protected:
    HRESULT ConfirmDevice( D3DCAPS9*, DWORD, D3DFORMAT );
    HRESULT DeleteRestoreDeviceObjects();
    HRESULT RestoreDeviceObjects();
    HRESULT FrameMove();
    HRESULT Render();
private:
    LPDIRECT3DVERTEXBUFFER9 m_pVB;         // Vertex buffer to hold vertices

콘트라크타

콘트라크타는, 윈도우 타이틀의 초기화, 깊이 버퍼링의 유효화, 및 정점 버퍼의 초기화를 실시한다.

CMyD3DApplication::CMyD3DApplication()
{
    m_strWindowTitle    = _T("D3D Example");    // title bar string
    m_bUseDepthBuffer   = TRUE;                 // enable depth buffer
    m_pVB               = NULL;                 // initialize  
}

윈도우 타이틀은, 애플리케이션을 기동 하면 타이틀 바 또는 윈도우 클래스에 표시되는 와이드 캐릭터 라인이다. 이것은 옵션이다.

base class는, 깊이 버퍼를 유효하게하기 위한 멤버 변수를 포함한다. 이 불리언 값의 디폴트값은 FALSE 로, 깊이 버퍼는 무효가 된다.

윈도우 타이틀은, Unicode 와 ANSI 문자를 지원 하는 TCHAR 캐릭터 라인이다. 애플리케이션의 기동시에, 타이틀 바에 표시된다. 이 캐릭터 라인은 CMyD3DApplication 의 유효기간중, 보관 유지된다.

장치의 확인

prototype는, 다음과 같이 된다.

HRESULT ConfirmDevice(D3DCAPS *pCaps, DWORD dwBehavior,
		      D3DFORMAT fmtBackBuffer)
}

[in] pCaps - 확인 대상 장치의 D3DCAPS 구조체의 포인터. 이 구조체의 멤버를 조사해, 지정된 장치에 애플리케이션이 필요로 하는 능력이 있을지 어떨지를 판단한다.

[in] dwBehavior - IDirect3D9::CreateDevice 의 동작 플래그에 대응하는 0 혹은 복수개의 플래그. 다음의 플래그는 지정된 장치의 동작을 나타낸다.

D3DCREATE_PUREDEVICE
D3DCREATE_HARDWARE_VERTEXPROCESSING
D3DCREATE_SOFTWARE_VERTEXPROCESSING
D3DCREATE_MIXED_VERTEXPROCESSING
}

CD3DApplication 는 다음의 순서로 장치의 동작을 확인한다.

퓨어 장치 동작에 대해서는, 퓨어 장치에 대한 지원이 나타나고 있는 장치만을 확인한다.

하드웨어 정점 처리에 대해서는, 하드웨어에 의한 변환과 조명에 대한 지원이 나타나고 있는 장치만을 확인한다.

[in] fmtBackBuffer - 장치의 디폴트의 스왑 체인에 관련된 백 버퍼의 지정된 포맷.

이 메서드를 오버라이드(override) 할 때, 지정된 장치의 능력, 동작 및 백 버퍼 포맷을 허용 할 수 있는 것인 경우는, 애플리케이션에서는 S_OK 를 돌려줄 필요가 있다. 그 이외의 경우는, E_FAIL 를 돌려줄 필요가 있다.

DeleteDeviceObjects

DeleteDeviceObjects 는, 애플리케이션을 종료 할 때 또는 장치를 변경할 경우에 호출된다. 정점 버퍼 등, 장치에 의존하는 개체를 삭제할 경우에 이 메서드를 사용한다.

HRESULT CVShader1::DeleteDeviceObjects()
{
    m_pQuadVB->Release();
    m_pQuadVB = NULL;
    return S_OK;

RestoreDeviceObjects

이 메서드는, 애플리케이션으로 장치 메모리 개체 및 장치 스테이트를 복원할 필요가 있을 때 호출된다. DirectX 장치를 생성 또는 사이즈 변경했을 때에는, 이것이 필요하게 된다. 이 메서드는, 개체의 생성과 렌더링 스테이트의 초기화에 관한 대부분의 작업을 실시한다.

HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
    // Create the vertex buffer.Allocate enough memory (from the default pool) 
	//   to hold the custom vertices.Specify the flexible vertex format (FVF),
    //   so the vertex buffer knows what data it contains.
    if( FAILED( m_pd3dDevice->CreateVertexBuffer(
                          NUM_VERTS*sizeof(CUSTOMVERTEX),
                          0,
                          D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pVB ) ) )
    {
        return E_FAIL;
    }
    // Fill the vertex buffer.First, lock the vertex buffer to get access to
    //   the vertices.This mechanism is required because vertex buffers 
    //   may be in device memory.Then use memcpy to do a fast data copy.
    VOID* pVertices;
    if( FAILED( m_pVB->Lock( 0, sizeof(g_Vertices), 
     (BYTE**) &pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
    m_pVB->Unlock();

    // Set the projection matrix.The size of the back buffer comes from the
    //   base class.
    D3DXMATRIX matProj;
    FLOAT fAspect = m_d3dsdBackBuffer.Width / 
                    (FLOAT) m_d3dsdBackBuffer.Height;
    D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, fAspect, 
                                 1.0f, 100.0f );
    m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

    // Set up the view matrix.A view matrix can be defined from an eye 
    //   point, a look-at point, and an up-direction vector.In this example, 
    //   the eye position is (0,1,-4) the look-at point is (0,0,0) and the 
    //   up vector is (0,1,0).
    D3DXMATRIX matView;
    D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 1.0f,-4. 0f ),
                                  &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
                                  &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
    m_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );

    // Set up default texture states.
    // Set up render states (this is only one example render state).
    m_pd3dDevice->SetRenderState( D3DRS_CULLMODE,     D3DCULL_NONE );

    return S_OK;

이 메서드는, 정점 버퍼를 생성 해, 그 중에 정점 데이터를 복사 한다. 뷰 행렬 및 투영 행렬도 생성 한다. 이러한 행렬은, 정점 버퍼내의 개체에 대한 카메라의 방향을 정의한다. 이 예에서는 가지 않지만, 이 메서드로 텍스처 스테이지 스테이트를 설정할 수 있다. 변경될 가능성의 낮은 렌더링 스테이트가 설정된다. 이것들에 의해, 장면(scene)의 렌더링 방법이 정해진다.

FrameMove

이 메서드에는, 애니메이션과 같이 1 프레임 마다 일어나는 액션을 넣는다. 이 예에서는, 월드 변환에, y 축을 중심으로 한 회전을 더하고 있다.

HRESULT CMyD3DApplication::FrameMove()
{
    // For our world matrix, just rotate the object about the y-axis.
    D3DXMATRIX matWorld;
    D3DXMatrixRotationY( &matWorld, ::TimeGetTime()/150. 0f );
    m_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );

    return S_OK;
}

Windows 메서드 ::TimeGetTime()는, 현재 시각을 돌려준다. 이것을 150 으로 나누면 개체를 일정 각도씩 회전 할 때의 1 회 분의 회전 각도를 얻을 수 있다.

Render

이 메서드는, 출력을 렌더링 할 경우에 호출된다. 뷰포트를 클리어 해, 장면(scene)와 스테이트의 변경을 렌더링 한다.

HRESULT CMyD3DApplication::Render()
{
    // Clear the viewport.
    m_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 
		D3DCOLOR_XRGB(0,0,0), 1.0f, 0L );

    // Begin the scene.
    if( SUCCEEDED( m_pd3dDevice->BeginScene() ) )
    {
        m_pd3dDevice->SetStreamSource( 0, m_pVB, sizeof(CUSTOMVERTEX) );
	    m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, NUM_TRIS );
        m_pd3dDevice->EndScene();
    }

    return S_OK;
}

Render 메서드는, 우선, Clear 를 사용해 뷰포트를 클리어 한다. 다음에, 대가 된 BeginScene 와 EndScene 의 사이에, SetStreamSource 를 사용해, 커스텀 정점 타입의 사이즈의 보폭과 함께 정점 버퍼 m_pVB 를 사용하는 것을 런타임에게 전한다. 다음에, 가장 단순한 타입의 유연한 정점 포맷 (FVF) 셰이더를 사용하는 것을 런타임에게 전한다. 마지막으로, DrawPrimitive 를 호출해 사각형을 렌더링 한다.

그 외의 함수

DeleteDeviceObjects 는, 애플리케이션을 종료 할 때 또는 장치를 변경할 경우에 호출된다. 이 메서드는, 장치에 의존하는 개체를 삭제하기 위해서 사용한다.

ConfirmDevice 는, 장치가 최소한의 기능 세트를 갖추고 있는지를 체크한다. 이 메서드는, 장치의 초기화중에 호출된다.

InvalidateDeviceObjects 는, 장치에 의존하는 개체가 삭제될 가능성이 있을 때 호출된다. 보통, 이 메서드에는, 정점 버퍼등의 장치에 의존하는 개체를 추가한다.

OneTimeSceneInit 는, 최초의 애플리케이션 기동시에 실행할 필요가 있는 코드용이다.

메일링리스트

그래픽스를 취급하고 있는 다른 개발자가 발견되는 장소의 1 개에, DirectX 개발자의 메일링리스트가 있다. 이것은 DirectX 개발자전용의 기술적인 디스커션의 포럼이며, 그래픽스, 네트워크, 및 입력에 관한 영역을 커버하고 있다. 이 메일링리스트의 어카이브(archive)는,DirectX Dev  World Wide Web 링크에 있다. 다른 메일링리스트와 같이, 이것은 기술 지원의 포럼은 아니다. 그러나, DirectX 에 관한 정보 소스로서 유용하다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP