Verwenden der Bumpzuordnung (Direct3D 9)
Erkennen der Unterstützung für die Bumpzuordnung
Ein Gerät kann eine Bumpzuordnung durchführen, wenn es entweder den D3DTOP_BUMPENVMAP oder D3DTOP_BUMPENVMAPLUMINANCE Texturmischungsvorgang unterstützt. Verwenden Sie IDirect3D9::CheckDeviceFormat mit D3DUSAGE_QUERY_LEGACYBUMPMAP, um festzustellen, ob ein Format für die Bumpzuordnung unterstützt wird.
Darüber hinaus sollten Anwendungen die Gerätefunktionen überprüfen, um sicherzustellen, dass das Gerät eine angemessene Anzahl von Überblendungsphasen (in der Regel mindestens drei) unterstützt und mindestens ein Pixelformat für die Bumpmapping verfügbar macht.
Im folgenden Codebeispiel wird anhand der angegebenen Kriterien die Gerätefunktionen überprüft, um die Unterstützung für die Bumpzuordnung auf dem aktuellen Gerät zu erkennen.
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;
}
Erstellen einer Bump Map-Textur
Sie erstellen eine Bumpmap-Textur wie jede andere Textur. Ihre Anwendung überprüft die Unterstützung für die Bump-Zuordnung und ruft ein gültiges Pixelformat ab, wie unter Erkennen der Unterstützung für bump mapping beschrieben.
Nachdem die Oberfläche erstellt wurde, können Sie jedes Pixel mit den entsprechenden Deltawerten und der Luminanz laden, wenn das Oberflächenformat die Luminanz enthält. Die Werte für jede Pixelkomponente werden unter Bump Map Pixel Formats (Direct3D 9) beschrieben.
Konfigurieren von Bumpzuordnungsparametern
Wenn Ihre Anwendung eine Bumpmap erstellt und den Inhalt der einzelnen Pixel festgelegt hat, können Sie sich auf das Rendering vorbereiten, indem Sie Bump mapping-Parameter konfigurieren. Zu den Parametern für die Bumpzuordnung gehören das Festlegen der erforderlichen Texturen und deren Mischvorgänge sowie die Transformations- und Leuchtdichtesteuerelemente für die Bumpmap selbst.
- Legen Sie bei Verwendung die Basistexturkarte fest, stoßen Sie die Texturen der Karte und die Umgebungszuordnung in Texturmischungsphasen.
- Legen Sie die Farb- und Alphamischungsvorgänge für jede Texturstufe fest.
- Legen Sie die Transformationsmatrix für die Bumpmap fest.
- Legen Sie die Leuchtdichteskala und die Offsetwerte nach Bedarf fest.
Im folgenden Codebeispiel werden drei Texturen (die Basistexturkarte, die Bumpmap und eine Spiegelumgebungskarte) auf die entsprechenden Texturmischungsphasen festgelegt.
// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );
Nachdem Sie die Texturen auf ihre Mischphasen festgelegt haben, werden im folgenden Codebeispiel die Mischvorgänge und Argumente für jede Phase vorbereitet.
// 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 );
Wenn die Mischvorgänge und Argumente festgelegt sind, legt das folgende Codebeispiel die 2x2-Bumpzuordnungsmatrix auf die Identitätsmatrix fest, indem die D3DTSS_BUMPENVMAPMAT00 und die D3DTSS_BUMPENVMAPMAT11 Member von D3DTEXTURESTAGESTATETYPE auf 1.0 festgelegt werden. Das Festlegen der Matrix auf die Identität bewirkt, dass das System die Deltawerte in der bump map unverändert verwendet, aber dies ist keine Anforderung.
// 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) );
Wenn Sie festlegen, dass die Luminanz (D3DTOP_BUMPENVMAPLUMINANCE) für die Bump mapping-Operation eingeschlossen wird, müssen Sie die Luminanzsteuerelemente festlegen. Die Luminanzsteuerelemente konfigurieren, wie das System die Luminanz berechnet, bevor die Farbe aus der Textur in der nächsten Phase moduliert wird. Weitere Informationen finden Sie unter 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) );
Nachdem Ihre Anwendung Bump-Zuordnungsparameter konfiguriert hat, kann sie wie gewohnt gerendert werden, und die gerenderten Polygone erhalten Bump-Mapping-Effekte.
Beachten Sie, dass im vorherigen Beispiel Parameter für die Zuordnung der spiegelförmigen Umgebung angezeigt werden. Bei der Diffuslichtzuordnung legen Anwendungen den Texturmischungsvorgang für die letzte Phase auf D3DTOP_MODULATE fest. Weitere Informationen finden Sie unter Diffuse Light Maps (Direct3D 9).
Zugehörige Themen