Använda bumpmappning (Direct3D 9)
Identifiera stöd för bumpmappning
En enhet kan utföra bumpmappning om den stöder antingen D3DTOP_BUMPENVMAP eller D3DTOP_BUMPENVMAPLUMINANCE texturblandningsfunktion. Använd IDirect3D9::CheckDeviceFormat med D3DUSAGE_QUERY_LEGACYBUMPMAP för att se om ett format stöds för bumpmappning.
Dessutom bör applikationer kontrollera enhetens kapabiliteter för att se till att enheten stöder ett lämpligt antal blandningssteg, vanligtvis minst tre, och tillhandahåller minst ett bildpunktsformat för bump-mapping.
I följande kodexempel kontrolleras enhetsfunktioner för att identifiera stöd för bumpmappning i den aktuella enheten med hjälp av de angivna kriterierna.
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;
}
Skapa en bumpkartetextur
Du skapar en bump map-struktur som vilken annan textur som helst. Ditt program verifierar stöd för bumpmappning och hämtar ett giltigt pixelformat, enligt beskrivningen i Identifiera stöd för bumpmappning.
När ytan har skapats kan du läsa in varje pixel med lämpliga deltavärden och luminans om ytformatet innehåller luminans. Värdena för varje pixelkomponent beskrivs i Bump Map Pixel Format (Direct3D 9).
Konfigurera bumpmappningsparametrarna
När programmet har skapat en bulakarta och ställt in innehållet i varje pixel kan du förbereda för rendering genom att konfigurera bumpmappningsparametrar. Parametrar för bumpmapping inkluderar att ställa in nödvändiga texturer och deras blandningsoperationer, samt kontroller för transformering och luminans för själva bumpkartan.
- Ange basstrukturkartan om den används, bump map och miljökartans texturer i texturblandningssteg.
- Ange färg- och alfablandningsåtgärder för varje struktursteg.
- Ange transformeringsmatrisen för bumpkartan.
- Ange luminansskalnings- och förskjutningsvärdena efter behov.
I följande kodexempel anges tre texturer (basstrukturkartan, bumpkartan och en detaljerad miljökarta) till lämpliga faser för texturblandning.
// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );
När du har ställt in texturerna på blandningsstegen förbereder följande kodexempel blandningsåtgärder och argument för varje steg.
// 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 );
När blandningsoperationerna och argumenten anges, ställer följande kodexempel in 2x2 bumpmappningsmatrisen till enhetsmatrisen genom att ställa in D3DTSS_BUMPENVMAPMAT00 och D3DTSS_BUMPENVMAPMAT11-medlemmarna i D3DTEXTURESTAGESTATETYPE till 1.0. Om du anger matrisen till identiteten kan systemet använda deltavärdena i bumpkartan oförändrade, men det är inte ett krav.
// 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) );
Om du anger att bumpmappningen ska innehålla luminans (D3DTOP_BUMPENVMAPLUMINANCE) måste du ange luminansinställningarna. Luminanskontrollerna konfigurerar hur systemet beräknar luminans innan färgen moduleras från strukturen i nästa steg. Mer information finns i 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) );
När programmet har konfigurerat bumpmappningsparametrar kan det renderas som vanligt och de renderade polygonerna får bumpmappningseffekter.
Observera att föregående exempel visar parametrar som angetts för spektulär miljömappning. När du utför diffus ljusmappning ställer program in texturblandningsåtgärden för den sista fasen till D3DTOP_MODULATE. Mer information finns i Diffuse Light Maps (Direct3D 9).
Relaterade ämnen