Platform SDK: DirectX |
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; }
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