Platform SDK: DirectX

キューブ マップ テクスチャの作成

キューブ マップ テクスチャの作成処理は、通常のテクスチャの作成処理と似ている。ただし、通常のテクスチャ属性のほかに、キューブ マップのどのサーフェスを作成するかを指定できる。

次のコードでは、D3DXCreateCubeMapTexture 関数を使用してキューブ マップ テクスチャを作成する。

    DWORD w = 256, h = 256;
    D3DX_SURFACEFORMAT sf = D3DX_SF_A8R8G8B8;
 
    hr = D3DXCreateCubeMapTexture(
                    m_pD3DDev,
                    0,                              // フラグ
                    DDSCAPS2_CUBEMAP_ALLFACES,      // サーフェス
                    0,                              // 空のサーフェスの色
                    &w,                             // 幅
                    &h,                             // 高さ
                    &sf,                            // サーフェス フォーマット
                    NULL,                           // パレット
                    &m_pEnvTex,                     // 結果のサーフェス
                    NULL);                          // ミップマップ レベル数

ここで、キューブ マップのサーフェスをロードする。

    DDSCAPS2 ddsCaps;
    ZeroMemory(&ddsCaps, sizeof(ddsCaps));
    for (i = 0; i < 6; i++)
    {
        DWORD FacesArray[] = 
        {
            DDSCAPS2_CUBEMAP_POSITIVEX,
            DDSCAPS2_CUBEMAP_NEGATIVEX,
            DDSCAPS2_CUBEMAP_POSITIVEY, 
            DDSCAPS2_CUBEMAP_NEGATIVEY,
            DDSCAPS2_CUBEMAP_POSITIVEZ, 
            DDSCAPS2_CUBEMAP_NEGATIVEZ
        };

キューブ マップの各サーフェスにファイル インデックスをマッピングする。

        DWORD FileIndex[] =
        {
            2, 0, 5, 4, 1, 3
        };

次のコードを使用して、正しいサーフェスを検索する。

        LPDIRECTDRAWSURFACE7 pFace;
        if (i != 0)
        {
            ddsCaps.dwCaps2 = FacesArray[i];
            if (FAILED(hr = m_pEnvTex->GetAttachedSurface(&ddsCaps, &pFace)))
                return hr;
        }

最後に、特別なケースである 0 サーフェスのキューブ マップを補正する必要がある。0 サーフェスのキューブ マップは、最上位の環境マップと同じである。

        else
        {
            pFace = m_pEnvTex;
            pFace->AddRef();
        }

デフォルトでは、キューブ マップの 6 サーフェスすべてが作成される。また、空のサーフェスで使用する色を指定することもできる。これにより、キューブ マップのサーフェスのいくつかが 1 つの色で適切に表されるときはメモリを節約できる。たとえば、キューブ マップ セットを使用して高速道路の照明から自動車のボンネットに対する反射をシミュレートする場合、必要なのは POSITIVE_Y サーフェスだけである。残りのサーフェスは、黒色で作成できる。