Verwenden der Bump-Zuordnung (Direct3D 9)
Erkennen der Unterstützung für die Bump-Zuordnung
Ein Gerät kann eine Bumpzuordnung durchführen, wenn es den _ Texturmischungsvorgang D3DTOP BUMPENVMAP oder D3DTOP _ BUMPENVMAPLUMINANCE 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 geeignete Anzahl von Überblendungsphasen (in der Regel mindestens drei) unterstützt und mindestens ein Bump mapping-Pixelformat verfügbar macht.
Im folgenden Codebeispiel werden die Gerätefunktionen überprüft, um die Unterstützung für die Bumpzuordnung auf dem aktuellen Gerät anhand der angegebenen Kriterien 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 BumpMap-Textur
Sie erstellen eine Bumpmaptextur wie jede andere Textur. Ihre Anwendung überprüft die Unterstützung für die Bumpzuordnung und ruft ein gültiges Pixelformat ab, wie unter Detecting Support for Bump Mapping (Erkennen der Unterstützung für die Bumpzuordnung) beschrieben.
Nachdem die Oberfläche erstellt wurde, können Sie jedes Pixel mit den entsprechenden Deltawerten und Leuchtdichte laden, wenn das Oberflächenformat Leuchtdichte enthält. Die Werte für jede Pixelkomponente werden unter Bump Map Pixel Formats (Direct3D 9)beschrieben.
Konfigurieren von Bump Mapping-Parametern
Wenn Ihre Anwendung eine Bumpmap erstellt und den Inhalt der einzelnen Pixel festgelegt hat, können Sie sich auf das Rendering vorbereiten, indem Sie Parameter für die Bumpzuordnung konfigurieren. Zu den Parametern für die Bumpzuordnung gehören das Festlegen der erforderlichen Texturen und deren Mischungsvorgänge sowie die Transformations- und Leuchtdichtesteuerelemente für die Bumpmap selbst.
- Legen Sie die Basistexturkarte (sofern verwendet), die Bumpmap und die Umgebungszuordnungstextur in Texturmischungsphasen fest.
- Legen Sie die Farb- und Alphamischungsvorgänge für jede Texturphase fest.
- Legen Sie die Transformationsmatrix für die Bumpmap fest.
- Legen Sie die Werte für Die Leuchtdichteskala und den Offset nach Bedarf fest.
Im folgenden Codebeispiel werden drei Texturen (die Basistexturkarte, die Bumpmap und eine Specular Environment Map) auf die entsprechenden Texturmischungsstufen festgelegt.
// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );
Nachdem die Texturen auf ihre Mischungsstufen festgelegt wurden, bereitet das folgende Codebeispiel die Füllvorgänge und Argumente für jede Phase vor.
// 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 Mischungsvorgänge und Argumente festgelegt sind, legt das folgende Codebeispiel die 2x2-Bumpzuordnungsmatrix auf die Identitätsmatrix fest, indem die Member D3DTSS _ BUMPENVMAPMAT00 und D3DTSS _ BUMPENVMAPMAT11 von D3DTEXTURESTAGESTATETYPE auf 1.0 festgelegt werden. Das Festlegen der Matrix auf die Identität bewirkt, dass das System die Deltawerte in der Bumpmap unverändert verwendet, dies ist jedoch keine Voraussetzung.
// 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 für den Vorgang für die Bumpzuordnung die Leuchtdichte (D3DTOP _ BUMPENVMAPLUMINANCE) festlegen, müssen Sie die Leuchtdichtesteuerelemente festlegen. Die Leuchtdichtesteuerelemente konfigurieren, wie das System die Leuchtdichte berechnet, bevor die Farbe in der nächsten Phase aus der Textur 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 Bumpzuordnungseffekte.
Beachten Sie, dass das vorherige Beispiel Parameter zeigt, die für die Specular-Umgebungszuordnung festgelegt wurden. Bei der Diffuslichtzuordnung legen Anwendungen den Texturmischungsvorgang für die letzte Phase auf D3DTOP _ MODULATE fest. Weitere Informationen finden Sie unter Diffuses Licht Karten (Direct3D 9).