Platform SDK: DirectX

バンプ マッピングのサポートの検出

[C++]

Direct3D デバイスが D3DTOP_BUMPENVMAP または D3DTOP_BUMPENVMAPLUMINANCE テクスチャ ブレンディング処理のいずれかをサポートしている場合、そのデバイスではバンプ マッピングを実行できる。また、アプリケーションではデバイス機能を調べることで、そのアプリケーションで適切なブレンディング ステージ数 (通常は 3 つ以上) がサポートされ、少なくとも 1 つのバンプ マッピング ピクセル フォーマットが公開されていることを確認する必要がある。

次のコードは、指定された条件によってデバイス機能を調べて、現在のデバイスでのバンプ マッピングのサポートを検出する。

BOOL SupportsBumpMapping() 
{
DDPIXELFORMAT ddpfBumpMap;
D3DDEVICEDESC7 d3dDevDesc;
ZeroMemory( &d3dDevDesc, sizeof(d3dDevDesc) );

// デバイス機能を取得する。
g_pd3dDevice->GetCaps( &d3dDevDesc );

// このデバイスが 2 つのバンプ マッピング ブレンド処理をサポートしているかどうか。
DWORD dwBumpOps = d3dDevDesc.dwTextureOpCaps & 
(D3DTEXOPCAPS_BUMPENVMAP | D3DTEXOPCAPS_BUMPENVMAPLUMINANCE);
if ( 0 == dwBumpOps)
return FALSE;

// このデバイスが最大 3 つのブレンディング ステージをサポートしているかどうか。
if( d3dDevDesc.wMaxTextureBlendStages < 3)
return FALSE;

    //
// 有効なバンプ マップ ピクセル フォーマットがあるかどうかを調べる。
    //

// 有効なフォーマットが検出された場合、
// コールバック関数によって g_bFoundBumpFormat グローバル変数が TRUE に設定される。
g_bFoundBumpFormat = FALSE;  

g_pd3dDevice->EnumTextureFormats(TextureCallback, (LPVOID) &ddpfBumpMap);
if( FALSE == g_bFoundBumpFormat )
return FALSE;

// 現在 ddpfBumpMap にあるピクセル フォーマットは、
// 有効であることが保証されているサーフェス フォーマットを作成するために使用できる。
return TRUE;
}

次のコードは、コールバック関数が IDirect3DDevice7::EnumTextureFormats メソッドに渡る。

HRESULT CALLBACK TextureCallback( DDPIXELFORMAT* pddpf, VOID* pddpfOut)
{
// 最初に列挙されている DuDv フォーマットを取得する。
if( DDPF_BUMPDUDV == pddpf->dwFlags ){
// 後でサーフェスを作成するときに使用できるように、
// フォーマットを pddpfOut の変数にコピーする。
memcpy( pddpfOut, (LPVOID)pddpf, sizeof(DDPIXELFORMAT) );

// 成功を知らせるグローバル フラグを設定する。
g_bFoundBumpFormat = TRUE;
return D3DENUMRET_CANCEL;
    }

return D3DENUMRET_OK;
} 
[Visual Basic]

Direct3D デバイスが D3DTOP_BUMPENVMAP または D3DTOP_BUMPENVMAPLUMINANCE テクスチャ ブレンディングのいずれかをサポートしている場合、そのデバイスではバンプ マッピングを実行できる。また、アプリケーションではデバイス機能を調べることで、そのアプリケーションで適切なブレンディング ステージ数 (通常は 3 つ以上) がサポートされ、少なくとも 1 つのバンプ マッピング ピクセル フォーマットが公開されていることを確認する必要がある。

次のコードは、指定された条件によってデバイス機能を調べて、現在のデバイスでのバンプ マッピングのサポートを検出する。

Function SupportsBumpMapping() As Boolean
Dim ddpfBumpMap As DDPIXELFORMAT
Dim d3dDevDesc As D3DDEVICEDESC7
    
SupportsBumpMapping = True
    
' デバイス機能を取得する。
Call g_d3dDevice.GetCaps(d3dDevDesc)

' このデバイスが 2 つのバンプ マッピング ブレンド処理をサポートしているかどうか。
Dim lBumpOps As Long
lBumpOps = (d3dDevDesc.lTextureOpCaps And _
(D3DTEXOPCAPS_BUMPENVMAP Or D3DTEXOPCAPS_BUMPENVMAPLUMINANCE))
    
If lBumpOps = 0 Then SupportsBumpMapping = False

' このデバイスが最大 3 つのブレンディング ステージをサポートしているかどうか。
If d3dDevDesc.nMaxTextureBlendStages < 3 Then SupportsBumpMapping = False

    '
' 有効なバンプ マップ ピクセル フォーマットがあるかどうかを調べる。
    '
Dim BumpEnum As Direct3DEnumPixelFormats
Set BumpEnum = g_d3dDevice.GetTextureFormatsEnum
    
Dim iLoop As Integer
For iLoop = 0 To BumpEnum.GetCount
Call BumpEnum.GetItem(iLoop, ddpfBumpMap)
        
' フォーマットが検出されたら、ループを停止する。
If ddpfBumpMap.lFlags And DDPF_BUMPDUDV Then Exit For
Next iLoop
    
If Not (ddpfBumpMap.lFlags And DDPF_BUMPDUDV) Then
SupportsBumpMapping = False
End If
End Function