(Direct3D 9)
偵測對碰撞對應的支援
如果裝置支援D3DTOP_BUMPENVMAP或D3DTOP_BUMPENVMAPLUMINANCE紋理混合作業,則裝置可以執行碰撞對應。 搭配使用 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 D3DTEXTURESTAGESTATETYPE 的成員設定為 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) 。
相關主題