Usando o mapeamento de colisão (Direct3D 9)

Detectando suporte para mapeamento de colisão

Um dispositivo poderá executar o mapeamento de colisão se der suporte à operação de mesclagem de textura D3DTOP_BUMPENVMAP ou D3DTOP_BUMPENVMAPLUMINANCE. Use IDirect3D9::CheckDeviceFormat com D3DUSAGE_QUERY_LEGACYBUMPMAP para ver se há suporte para um formato para mapeamento de colisão.

Além disso, os aplicativos devem marcar os recursos do dispositivo para garantir que o dispositivo dê suporte a um número apropriado de estágios de mesclagem, geralmente pelo menos três, e exponha pelo menos um formato de pixel de mapeamento de colisão.

O exemplo de código a seguir verifica os recursos do dispositivo para detectar suporte para mapeamento de colisão no dispositivo atual, usando os critérios especificados.

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

Criando uma textura de mapa de colisão

Você cria uma textura de mapa de colisão como qualquer outra textura. Seu aplicativo verifica o suporte para mapeamento de colisão e recupera um formato de pixel válido, conforme discutido em Detectando suporte para mapeamento de colisão.

Depois que a superfície for criada, você poderá carregar cada pixel com os valores delta apropriados e luminância, se o formato da superfície incluir luminância. Os valores para cada componente de pixel são descritos em Formatos de Pixel do Mapa de Colisão (Direct3D 9).

Configurando parâmetros de mapeamento de colisão

Quando o aplicativo tiver criado um mapa de colisão e definido o conteúdo de cada pixel, você poderá se preparar para a renderização configurando parâmetros de mapeamento de colisão. Os parâmetros de mapeamento de colisão incluem a definição das texturas necessárias e suas operações de mesclagem, bem como os controles de transformação e luminância para o próprio mapa de colisão.

  1. Defina o mapa de textura base se usado, o mapa de colisão e as texturas do mapa de ambiente em estágios de mesclagem de textura.
  2. Defina as operações de combinação de cores e alfa para cada estágio de textura.
  3. Defina a matriz de transformação do mapa de colisão.
  4. Defina os valores de escala e deslocamento de luminância conforme necessário.

O exemplo de código a seguir define três texturas (o mapa de textura base, o mapa de colisão e um mapa de ambiente especular) para os estágios de mesclagem de textura apropriados.

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

Depois de definir as texturas para seus estágios de mesclagem, o exemplo de código a seguir prepara as operações de mesclagem e os argumentos para cada estágio.

// 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 as operações de mesclagem e os argumentos são definidos, o exemplo de código a seguir define a matriz de mapeamento de colisão 2x2 para a matriz de identidade definindo o D3DTSS_BUMPENVMAPMAT00 e os membros D3DTSS_BUMPENVMAPMAT11 de D3DTEXTURESTAGESTATETYPE como 1,0. Definir a matriz como a identidade faz com que o sistema use os valores delta no mapa de colisão não modificado, mas isso não é um 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 você definir a operação de mapeamento de colisão para incluir luminância (D3DTOP_BUMPENVMAPLUMINANCE), deverá definir os controles de luminância. Os controles de luminância configuram como o sistema calcula a luminância antes de modular a cor da textura no próximo estágio. Para obter detalhes, consulte Fórmulas de mapeamento de colisão (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) );

Depois que o aplicativo configurar parâmetros de mapeamento de colisão, ele poderá ser renderizado normalmente e os polígonos renderizados receberão efeitos de mapeamento de colisão.

Observe que o exemplo anterior mostra parâmetros definidos para mapeamento de ambiente especular. Ao executar o mapeamento de luz difusa, os aplicativos definem a operação de mesclagem de textura para o último estágio como D3DTOP_MODULATE. Para obter mais informações, consulte Mapas de luz difusos (Direct3D 9).

Mapeamento de colisão