Korzystanie z mapowania wypukłości (Direct3D 9)
Urządzenie może wykonywać mapowanie zderzaków, jeśli obsługuje operację łączenia tekstur D3DTOP_BUMPENVMAP lub D3DTOP_BUMPENVMAPLUMINANCE. Użyj IDirect3D9::CheckDeviceFormat z D3DUSAGE_QUERY_LEGACYBUMPMAP, aby sprawdzić, czy format jest obsługiwany na potrzeby mapowania zderzaków.
Ponadto aplikacje powinny sprawdzać możliwości urządzenia, aby upewnić się, że obsługuje ono odpowiednią liczbę etapów mieszania, zazwyczaj co najmniej trzech, i udostępnia co najmniej jeden format pikseli mapowania wypukłości.
Poniższy przykład kodu sprawdza możliwości urządzenia w celu wykrywania obsługi mapowania zderzaków na bieżącym urządzeniu przy użyciu podanych kryteriów.
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;
}
Tworzysz teksturę mapy wypukłości jak każdą inną teksturę. Aplikacja weryfikuje obsługę mapowania wypukłości i pobiera prawidłowy format pikseli, jak opisano w sekcji Wykrywanie obsługi mapowania wypukłości.
Po utworzeniu powierzchni można załadować każdy piksel odpowiednimi wartościami różnicowymi oraz luminancją, jeśli format powierzchni obejmuje luminancję. Wartości dla każdego składnika pikseli są opisane w Bump Map Pixel Formats (Direct3D 9).
Gdy aplikacja utworzyła mapę bump i ustawiła zawartość każdego piksela, możesz przygotować się do renderowania, konfigurując parametry mapowania bump. Parametry mapowania wypukłości obejmują ustawienie wymaganych tekstur i ich operacji mieszania, a także kontrolki przekształcania i jasności dla samej mapy wypukłości.
- Ustaw mapę tekstury bazowej, jeśli jest używana, mapę wypukłości oraz tekstury mapowania środowiska na etapy mieszania tekstur.
- Ustaw operacje łączenia kolorów i alfa dla każdego etapu tekstury.
- Ustaw macierz przekształcania mapy bump.
- Ustaw wartości skali i przesunięcia jasności zgodnie z potrzebami.
Poniższy przykład kodu ustawia trzy tekstury (mapę tekstury podstawowej, mapę zderzaków i szczegółową mapę środowiska) na odpowiednie etapy łączenia tekstur.
// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );
Po ustawieniu tekstur na ich etapy mieszania poniższy przykład kodu przygotowuje operacje mieszania i argumenty dla każdego etapu.
// 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 );
Po ustawieniu operacji mieszania i argumentów poniższy przykład kodu ustawia macierz mapowania 2x2 bump na macierz tożsamości przez ustawienie D3DTSS_BUMPENVMAPMAT00 i D3DTSS_BUMPENVMAPMAT11 elementów członkowskich D3DTEXTURESTAGESTATETYPE na 1.0. Ustawienie macierzy na tożsamość powoduje, że system używa wartości delty w mapie wypukłości w niezmienionej formie, ale nie jest to konieczne.
// 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) );
Jeśli ustawisz operację mapowania wypukłości tak, aby zawierała luminancję (D3DTOP_BUMPENVMAPLUMINANCE), musisz ustawić kontrolki luminancji. Elementy sterujące jasnością konfigurują sposób, w jaki system oblicza jasność przed modyfikowaniem koloru z tekstury na następnym etapie. Aby uzyskać szczegółowe informacje, zobacz Bump Mapping Formulas (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) );
Po skonfigurowaniu parametrów mapowania wypukłości aplikacja może renderować jak zwykle, a renderowane wielokąty otrzymują efekty mapowania wypukłości.
Zwróć uwagę, że w poprzednim przykładzie przedstawiono parametry ustawione na potrzeby mapowania środowiska szczegółowego. Podczas mapowania światła rozproszonego aplikacje ustawiają operację łączenia tekstur dla ostatniego etapu na D3DTOP_MODULATE. Aby uzyskać więcej informacji, zobacz rozproszone mapy światła (Direct3D 9).
-
mapowanie bump