バンプ マッピングの使用 (Direct3D 9)

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

デバイスは、D3DTOP_BUMPENVMAPまたはテクスチャ ブレンド操作D3DTOP_BUMPENVMAPLUMINANCEサポートしている場合、バンプ マッピングを実行できます。 D3DUSAGE_QUERY_LEGACYBUMPMAPで IDirect3D9::CheckDeviceFormat を使用して、バンプ マッピングでフォーマットがサポートされているかどうかを確認します。

さらに、アプリケーションはデバイス機能をチェックして、デバイスが適切な数のブレンド ステージ (通常は 3 つ以上) をサポートし、少なくとも 1 つのバンプ マッピング ピクセル形式を公開するようにする必要があります。

次のコード例では、指定された条件を使用して、デバイスの機能をチェックして、現在のデバイスでのバンプ マッピングのサポートを検出します。

BOOL SupportsBumpMapping()
{
    D3DCAPS9 d3dCaps;

    d3dDevice->GetDeviceCaps( &d3dCaps );

    // Does this device support the two bump mapping blend operations?
    if ( 0 == d3dCaps.TextureOpCaps & ( D3DTEXOPCAPS_BUMPENVMAP |
                                            D3DTEXOPCAPS_BUMPENVMAPLUMINANCE ))
        return FALSE;

    // Does this device support up to three blending stages?
    if( d3dCaps.MaxTextureBlendStages < 3 )
        return FALSE;

    return TRUE;
}

バンプ マップ テクスチャの作成

他のテクスチャと同様にバンプ マップ テクスチャを作成します。 アプリケーションは、バンプ マッピングのサポートを検証し、「バンプ マッピングのサポートの検出」で説明されているように、有効なピクセル形式を取得します。

サーフェスを作成した後、サーフェス形式に輝度が含まれている場合は、適切な差分値と輝度を使用して各ピクセルを読み込むことができます。 各ピクセル コンポーネントの値については、「 バンプ マップのピクセル形式 (Direct3D 9)」を参照してください。

バンプ マッピング パラメータの設定

アプリケーションでバンプ マップを作成し、各ピクセルの内容を設定したら、バンプ マッピング パラメーターを構成してレンダリングを準備できます。 バンプ マッピング パラメーターには、必要なテクスチャとそのブレンド操作、およびバンプ マップ自体の変換と輝度コントロールの設定が含まれます。

  1. 基本テクスチャ マップを使用する場合は、バンプ マップ、環境マップ テクスチャをテクスチャ ブレンド ステージに設定します。
  2. 各テクスチャ ステージの色とアルファ ブレンド操作を設定します。
  3. バンプ マップ変換マトリックスを設定します。
  4. 必要に応じて、輝度スケールとオフセット値を設定します。

次のコード例では、3 つのテクスチャ (基本テクスチャ マップ、バンプ マップ、および反射環境マップ) を適切なテクスチャ ブレンド ステージに設定します。

// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );

テクスチャをブレンド ステージに設定した後、次のコード例では、各ステージのブレンド操作と引数を準備します。

// Set the color operations and arguments to prepare for
//   bump mapping.

// Stage 0: The base texture
d3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
d3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); 
d3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 1 );

// Stage 1: The bump map - Use luminance for this example.
d3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 1 );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );

// Stage 2: A specular environment map
d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3dDevice->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );

ブレンド操作と引数を設定する場合、次のコード例では、 D3DTSS_BUMPENVMAPMAT00と D3DTEXTURESTAGESTATETYPE の D3DTSS_BUMPENVMAPMAT11 メンバーを 1.0 に設定することで、2x2 バンプ マッピング マトリックスを ID マトリックスに設定します。 行列を ID に設定すると、システムはバンプ マップの差分値を変更されずに使用しますが、これは要件ではありません。

// Set the bump mapping matrix.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, F2DW(1.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, F2DW(0.0f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, F2DW(1.0f) );

輝度 (D3DTOP_BUMPENVMAPLUMINANCE) を含むようにバンプ マッピング操作を設定する場合は、輝度コントロールを設定する必要があります。 輝度コントロールは、次のステージでテクスチャから色を調整する前に、システムが輝度を計算する方法を構成します。 詳細については、「 バンプ マッピング式 (Direct3D 9)」を参照してください。

// Set luminance controls. This is only needed when using
// a bump map that contains luminance, and when the 
// D3DTOP_BUMPENVMAPLUMINANCE texture blending operation is
// being used.
//
// Note  These calls rely on the following inline shortcut function:
//   inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, F2DW(0.5f) );
d3dDevice->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );

アプリケーションでバンプ マッピング パラメーターを構成すると、通常どおりにレンダリングでき、レンダリングされたポリゴンはバンプ マッピング効果を受け取ります。

前の例では、反射環境マッピング用に設定されたパラメーターが示されていることに注意してください。 拡散光マッピングを実行する場合、アプリケーションは最後のステージのテクスチャ ブレンド操作をD3DTOP_MODULATEに設定します。 詳細については、「 拡散光マップ (Direct3D 9)」を参照してください。

バンプ マッピング