Ler em inglês

Partilhar via


Usando o mapeamento de colisão (Direct3D 9)

Detetando suporte para mapeamento de colisões

Um dispositivo pode executar o mapeamento de rugosidade se suportar a operação de mistura de texturas D3DTOP_BUMPENVMAP ou D3DTOP_BUMPENVMAPLUMINANCE. Use IDirect3D9::CheckDeviceFormat com D3DUSAGE_QUERY_LEGACYBUMPMAP para ver se um formato é suportado para mapeamento de impactos.

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

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

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 Detetando suporte para mapeamento de colisão.

Depois de criar a superfície, pode carregar cada pixel com os valores delta apropriados e a luminância, se o formato da superfície incluir a luminância. Os valores para cada componente de pixel são descritos em Bump Map Pixel Formats (Direct3D 9).

Configurando parâmetros de mapeamento de colisão

Quando a aplicação tiver criado um mapa de relevo e definido o conteúdo de cada pixel, pode-se preparar para a renderização configurando os parâmetros de mapeamento de relevo. Os parâmetros de mapeamento de colisões incluem a definição das texturas necessárias e suas operações de mistura, 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 relevo e as texturas do mapa de ambiente nos estágios de mistura de textura.
  2. Defina as operações de mistura de cor e alfa para cada estágio de textura.
  3. Defina a matriz de transformação do mapa de colisão.
  4. Defina a escala de luminância e o deslocamento de valores conforme necessário.

O exemplo de código a seguir define três texturas (o mapa de textura base, o mapa de solavancos e um mapa de ambiente especular) para os estágios de mistura 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 mistura, o exemplo de código a seguir prepara as operações de mistura e 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 mistura e os argumentos são definidos, o exemplo de código a seguir define a matriz de mapeamento de relevo 2x2 como matriz de identidade, ao definir os membros D3DTSS_BUMPENVMAPMAT00 e D3DTSS_BUMPENVMAPMAT11 de D3DTEXTURESTAGESTATETYPE como 1.0. Definir a matriz para a identidade faz com que o sistema use os valores delta no mapa de colisão sem modificações, 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 na próxima etapa. Para obter detalhes, consulte 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) );

Depois que seu aplicativo configura os parâmetros de mapeamento de impacto, ele pode renderizar como normal e os polígonos renderizados recebem efeitos de mapeamento de impacto.

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 mistura de textura para o último estágio como D3DTOP_MODULATE. Para obter mais informações, consulte Diffuse Light Maps (Direct3D 9).

Bump Mapping