Condividi tramite


Uso del mapping di urto (Direct3D 9)

Rilevamento del supporto per il mapping di urto

Un dispositivo può eseguire il mapping di urto se supporta l'operazione di D3DTOP_BUMPENVMAP o D3DTOP_BUMPENVMAPLUMINANCE fusione trama. Usare IDirect3D9::CheckDeviceFormat con D3DUSAGE_QUERY_LEGACYBUMPMAP per verificare se un formato è supportato per il mapping di urto.

Inoltre, le applicazioni devono controllare le funzionalità del dispositivo per assicurarsi che il dispositivo supporti un numero appropriato di fasi di fusione, in genere almeno tre ed espone almeno un formato di pixel di mapping di urto.

L'esempio di codice seguente controlla le funzionalità del dispositivo per rilevare il supporto per il mapping di urto nel dispositivo corrente usando i criteri specificati.

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;
}

Creazione di una trama mappa di urto

Si crea una trama della mappa a urto come qualsiasi altra trama. L'applicazione verifica il supporto per il mapping di urto e recupera un formato pixel valido, come illustrato in Rilevamento del supporto per il mapping di urto.

Dopo aver creato la superficie, è possibile caricare ogni pixel con i valori delta appropriati e la luminanza, se il formato di superficie include la luminanza. I valori per ogni componente pixel sono descritti in Formati pixel mappa urto (Direct3D 9).

Configurazione dei parametri di mapping di urto

Quando l'applicazione ha creato una mappa d'urto e impostare il contenuto di ogni pixel, è possibile prepararsi per il rendering configurando i parametri di mapping di urto. I parametri di mapping di urto includono l'impostazione delle trame necessarie e le relative operazioni di fusione, nonché i controlli di trasformazione e luminanza per la mappa del urto stesso.

  1. Impostare la mappa della trama di base se usata, mappa di urto e trame della mappa dell'ambiente nelle fasi di fusione delle trame.
  2. Impostare le operazioni di fusione alfa e colore per ogni fase di trama.
  3. Impostare la matrice di trasformazione della mappa di urto.
  4. Impostare la scala di luminanza e i valori di offset in base alle esigenze.

Nell'esempio di codice seguente vengono impostate tre trame (mappa della trama di base, mappa di urto e mappa dell'ambiente speculare) alle fasi di fusione della trama appropriate.

// Set the three textures.
d3dDevice->SetTexture( 0, d3dBaseTexture );
d3dDevice->SetTexture( 1, d3dBumpMap );
d3dDevice->SetTexture( 2, d3dEnvMap );

Dopo aver impostato le trame sulle fasi di fusione, l'esempio di codice seguente prepara le operazioni di fusione e gli argomenti per ogni fase.

// 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 );

Quando vengono impostate le operazioni di fusione e gli argomenti, nell'esempio di codice seguente viene impostata la matrice di mapping 2x2 alla matrice di identità impostando l'D3DTSS_BUMPENVMAPMAT00 e i membri D3DTSS_BUMPENVMAPMAT11 di D3DTEXTURESTAGESTATETYPE su 1.0. L'impostazione della matrice sull'identità causa l'uso dei valori differenziali nella mappa di urto non modificata, ma non è un requisito.

// 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) );

Se si imposta l'operazione di mapping di urto per includere la luminanza (D3DTOP_BUMPENVMAPLUMINANCE), è necessario impostare i controlli di luminanza. I controlli di luminanza configurano il modo in cui il sistema calcola la luminanza prima di modulare il colore dalla trama nella fase successiva. Per informazioni dettagliate, vedere Formule di mapping di urto (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) );

Dopo che l'applicazione configura i parametri di mapping di urto, può eseguire il rendering come normale e i poligoni di cui è stato eseguito il rendering ricevono effetti di mapping di urto.

Si noti che l'esempio precedente mostra i parametri impostati per il mapping dell'ambiente speculare. Quando si esegue il mapping di luce diffuso, le applicazioni impostano l'operazione di fusione della trama per l'ultima fase su D3DTOP_MODULATE. Per altre informazioni, vedere Diffuse Light Maps (Direct3D 9).

Mapping di urto