Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wykrywanie obsługi mapowania wypukłości
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;
}
Tworzenie tekstury mapy wypukłości
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).
Konfigurowanie parametrów mapowania wypukłości
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).
Tematy pokrewne
-
mapowanie bump