Platform SDK: DirectX

ステップ 1.2 : テクスチャ サーフェスを準備する

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。

[C++]

一般に、実際のテクスチャ サーフェスを準備する場合は、まずビットマップのハンドルを作成し、そのハンドルにテクスチャ サーフェスをロードする必要がある。ただし、ビットマップのハンドルを作成する場合は、アプリケーションがビットマップ ファイル ("tree1.bmp"、"tex1.bmp"、および "earth.bmp") を確実に検出できなければならない。最初のステップとして、ビットマップ ファイルの実行可能ファイルのリソースをチェックする。

    HBITMAP hbm = (HBITMAP)LoadImage( GetModuleHandle(NULL), strName, 
                              IMAGE_BITMAP, 0, 0, 
                              LR_CREATEDIBSECTION);

上記の LoadImage 関数の呼び出しでは、最初の引数は呼び出しプロセスを作成するためのファイルのハンドル、つまり実行可能ファイルのリソースである。この最初のパラメータにより、ロードする画像を格納するモジュールのインスタンスへのハンドルを返すことができる。第 2 パラメータは、ロードするビットマップ画像を特定する。第 3、第 4、および第 5 パラメータは、ビットマップ タイプのロード、およびビットマップ画像の実際の幅と高さを指定する。最後の引数はロード フラグである。これにより、ディスプレイ デバイスのカラーにマッピングせずにビットマップをロードする。

LoadImage の詳細については、「プラットフォーム SDK」を参照すること。

Texture アプリケーションでは、呼び出しプロセスの作成に使用されるファイルへのハンドルを使ってファイルを検出できなかった場合、ビットマップ画像をファイルとしてロードしようとする。ただし、実際のアプリケーションでは、複数のファイル パスを検索してビットマップを探そうとする。

      hbm = (HBITMAP)LoadImage( NULL, strName, IMAGE_BITMAP, 0, 0, 
                                LR_LOADFROMFILE|LR_CREATEDIBSECTION );

上記の LoadImage 関数の呼び出しでは、画像を格納するインスタンスのハンドルが指定されていないが、LR_LOADFROMFILE ロード フラグを設定することで、strName パラメータがビットマップ画像を格納するファイル名であることを示している。

テクスチャを準備および作成するタスクは、次のプログラマ定義関数 CreateTextureFromBitmap を呼び出して行う。この関数には、レンダリング デバイスへの参照、およびテクスチャとして使用するビットマップへのハンドルを渡す。

    return CreateTextureFromBitmap( pd3dDevice, hbm );

CreateTextureFromBitmap はデバイス能力を取得する。これにより、デバイスにテクスチャの使用に関する制約があるかどうかを調べることができる。

    D3DDEVICEDESC7 ddDesc;
    ddDesc.dwSize = sizeof(D3DDEVICEDESC7);
    if( FAILED( pd3dDevice->GetCaps( &ddDesc ) ) )
        return NULL;

上記のコードでは、D3DDEVICEDESC7 構造体の ddDesc が初期化される。次に、IDirect3DDevice7::GetCaps メソッドを使用してレンダリング デバイスの記述を取得する。

次に、GetObject 関数を使用して、テクスチャとして使うビットマップを取得する。これにより、ビットマップ グラフィックス オブジェクトの幅と高さを取得できるようになる。

    BITMAP bm;
    GetObject( hbm, sizeof(BITMAP), &bm );
    DWORD dwWidth  = (DWORD)bm.bmWidth;
    DWORD dwHeight = (DWORD)bm.bmHeight;

BITMAP 構造体は、ビットマップを定義する GDI 構造体である。詳細については、「プラットフォーム SDK」を参照すること。

GetObject 関数は、指定されたグラフィックス オブジェクトに関する情報を取得する GDI 関数である。詳細については、「プラットフォーム SDK」を参照すること。

テクスチャ サーフェスの記述には DDSURFACEDESC2 構造体を使用する。この時点で、テクスチャに新しいサーフェス記述を設定できる。

    DDSURFACEDESC2 ddsd;
    ZeroMemory( &ddsd, sizeof(DDSURFACEDESC2) );
    ddsd.dwSize          = sizeof(DDSURFACEDESC2);
    ddsd.dwFlags         = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|
                           DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE;
    ddsd.ddsCaps.dwCaps  = DDSCAPS_TEXTURE;
    ddsd.dwWidth         = dwWidth;
    ddsd.dwHeight        = dwHeight;

特に制御フラグ DDSCAPS_TEXTURE を設定することで、サーフェスによってテクスチャ サーフェスを記述することをシステムに知らせる。次は、自動テクスチャ管理を有効にする。このステップについては、「ステップ 1.3 : テクスチャ管理を有効にする」で説明する。