使用凹凸紋理映射(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)來描述。
設定凸起對應參數
當您的應用程式建立凹凸貼圖並設定每個像素的內容時,您可以配置凹凸貼圖參數來準備渲染。 凹凸對應參數包括設定所需的紋理及其混合操作,以及凹凸貼圖的變換和光照控制。
- 如果使用基底紋理地圖、顛簸地圖和環境地圖紋理,請將它們設定到紋理混合階段。
- 設定每一個紋理階段的色彩和Alpha融合運算。
- 設定凸起地圖轉換矩陣。
- 根據需要設定亮度刻度和偏移值。
下列程式代碼範例會將三個紋理(基底紋理地圖、凹凸圖和反射環境地圖)設定為適當的紋理混合階段。
// 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)。
相關主題