Sprite で TEXT を表示

Sprite で TEXT を表示する

D3D10 Vsync on (640x480), R8G8B8A8_UNORM_SRGB (MS1, Q0)

HARDWARE: NVIDIA GeForce GT 220

Sample Brower の EmptyProject10 をベースに Sprite で TEXT 文字列を表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの説明

  1. 2011/12/10 に確認した所、以前 Visual Studio .NET2005 & Aug 2007 で作成したプロジェクトがエラーで動かなくなりました。
    そこで Windows7 & C++ 2010 Express & June 2010 & DirectX10 対応ボードの組み合わせで再プログラミングします。
  2. [スタート] から [プログラム][Microsoft DirectX] を選択して [DirectX Sample Browser] を起動して下さい。
    [EmptyProject10] の [Install Project] をクリックすると、自動的に空のプロジェクトが構築されます。
    作成されたプロジェクトをそのままコンパイルして、空のウインドウが表示される事を確かめて下さい。
    エラーが発生するときや、正常に実行出来ないときは、残念ながら現在の構成は相性が悪いようです。
  3. EmptyProject10 には EmptyProject9.cpp と EmptyProject10.cpp が格納されています。
    EmptyProject10.cpp を修正して Sprite で TEXT 文字列を表示します。
    SDKmisc.h を取り込んで下さい。
    g_pFont は Sprite で表示するフォントを定義します。
    g_pSprite は Sprite Object の定義です。
    g_pTxtHelper は TEXT を表示するための Helper です。
    TEXT を表示する RenderText() 関数のプロトタイプ宣言をします。
    #include "DXUT.h"
    #include "SDKmisc.h"
    
    ID3DX10Font*                g_pFont = NULL;         // Font for drawing text
    ID3DX10Sprite*              g_pSprite = NULL;       // Sprite for batching text drawing
    CDXUTTextHelper*            g_pTxtHelper = NULL;
    
    void    RenderText();
    
  4. DirectX の主要な処理は CALLBACK 関数で行います。
    OnD3D10CreateDevice() はデバイスを生成するときに呼ばれます。
    今回は Sprite の初期化と表示するフォントを設定します。
    "Arial" はフォントの名前で 24 は文字の大きさです。
    二種類用意したので、試してみて下さい。
    HRESULT CALLBACK OnD3D10CreateDevice( ID3D10Device* pd3dDevice,
                     const DXGI_SURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
    {
        HRESULT hr;
    
        V_RETURN( D3DX10CreateFont( pd3dDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
        //V_RETURN( D3DX10CreateFont( pd3dDevice, 24, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
            OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, L"Arial", &g_pFont ) );
        V_RETURN( D3DX10CreateSprite( pd3dDevice, 512, &g_pSprite ) );
        g_pTxtHelper = new CDXUTTextHelper( NULL, NULL, g_pFont, g_pSprite, 15 );
        //g_pTxtHelper = new CDXUTTextHelper( NULL, NULL, g_pFont, g_pSprite, 24 );
        return S_OK;
    }
    
  5. OnD3D10FrameRender() は Rendering を行う CALLBACK 関数です。
    今回は Sprite でテキストを表示する RenderText() 関数を呼んでいます。
    ClearColor[4] はウインドウをクリアする背景色の設定です。
    void CALLBACK OnD3D10FrameRender( ID3D10Device* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
    {
        // Clear render target and the depth stencil 
        float ClearColor[4] = { 0.176f, 0.196f, 0.667f, 0.0f };
        pd3dDevice->ClearRenderTargetView( DXUTGetD3D10RenderTargetView(), ClearColor );
        pd3dDevice->ClearDepthStencilView( DXUTGetD3D10DepthStencilView(), D3D10_CLEAR_DEPTH, 1.0, 0 );
        RenderText();
    }
    
  6. TEXT を表示する RenderText() 関数です。
    SetInsertionPos() で TEXT の座標を設定します。
    SetForegroundColor() で文字の色を設定します。
    DrawTextLine() で TEXT を描画します。
    void RenderText()
    {
        g_pTxtHelper->Begin();
        g_pTxtHelper->SetInsertionPos( 0, 10 );
        g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
        g_pTxtHelper->DrawTextLine( DXUTGetFrameStats( DXUTIsVsyncEnabled() ) );
        g_pTxtHelper->SetInsertionPos( 0, 60 );
        g_pTxtHelper->SetForegroundColor( D3DXCOLOR( 0.0f, 1.0f, 0.0f, 1.0f ) );
        g_pTxtHelper->DrawTextLine( DXUTGetDeviceStats() );
        g_pTxtHelper->End();
    }
    
  7. OnD3D10DestroyDevice() で取得した Object を開放して下さい。
    void CALLBACK OnD3D10DestroyDevice( void* pUserContext )
    {
        SAFE_DELETE( g_pTxtHelper );
        SAFE_RELEASE( g_pFont );
        SAFE_RELEASE( g_pSprite );
    }
    
  8. プロジェクトを実行すると DXUTGetFrameStats と DXUTGetDeviceStats が表示されます。
    私の場合の実行結果です。
    D3D10 Vsync on (640x480), R8G8B8A8_UNORM_SRGB (MS1, Q0)
    
    HARDWARE: NVIDIA GeForce GT 220
    

超初心者のプログラム入門(DirectX10 game program)