共用方式為


使用凹凸紋理映射(Direct3D 9)

偵測凹凸對應支援

如果裝置支援 D3DTOP_BUMPENVMAP 或 D3DTOP_BUMPENVMAPLUMINANCE 紋理混合作業,即可進行 bump mapping。 使用 IDirect3D9::CheckDeviceFormat 搭配 D3DUSAGE_QUERY_LEGACYBUMPMAP,以查看是否支援凸起對應的格式。

此外,應用程式應檢查裝置的功能,以確保裝置支持適當數目的混合階段,通常至少需要三個,並且至少公開一種凹凸貼圖像素格式。

下列程式碼範例會使用指定的準則來檢查裝置的功能,藉此偵測目前裝置是否支援浮雕貼圖。

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. 設定每一個紋理階段的色彩和Alpha融合運算。
  3. 設定凸起地圖轉換矩陣。
  4. 根據需要設定亮度刻度和偏移值。

下列程式代碼範例會將三個紋理(基底紋理地圖、凹凸圖和反射環境地圖)設定為適當的紋理混合階段。

// 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 );

當設定混合作業和自變數時,下列程式代碼範例透過將 D3DTEXTURESTAGESTATETYPE 的 D3DTSS_BUMPENVMAPMAT00 和 D3DTSS_BUMPENVMAPMAT11 成員設定為 1.0,將 2x2 凸起映射矩陣設為單位矩陣。 將矩陣設為單位矩陣會使系統未修改地使用凹凸貼圖中的差異值,但這並不是必須的。

// 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)

凹凸貼圖