Uso de la asignación de golpes (Direct3D 9)

Detección de la compatibilidad con la asignación de bump

Un dispositivo puede realizar una asignación de golpes si admite la operación de combinación de texturas D3DTOP_BUMPENVMAP o D3DTOP_BUMPENVMAPLUMINANCE. Use IDirect3D9::CheckDeviceFormat con D3DUSAGE_QUERY_LEGACYBUMPMAP para ver si se admite un formato para la asignación de golpes.

Además, las aplicaciones deben comprobar las funcionalidades del dispositivo para asegurarse de que el dispositivo admite un número adecuado de fases de fusión, normalmente al menos tres, y expone al menos un formato de píxel de asignación de golpes.

En el ejemplo de código siguiente se comprueban las funcionalidades del dispositivo para detectar la compatibilidad con la asignación de aumentos en el dispositivo actual mediante los criterios 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;
}

Creación de una textura de mapa de parachoques

Crea una textura de mapa de golpes como cualquier otra textura. La aplicación comprueba la compatibilidad con la asignación de golpes y recupera un formato de píxel válido, como se describe en Detección de compatibilidad con la asignación de golpes.

Una vez creada la superficie, puede cargar cada píxel con los valores delta adecuados y la luminancia, si el formato de superficie incluye luminancia. Los valores de cada componente de píxeles se describen en Formatos de píxeles de mapa de golpes (Direct3D 9).

Configuración de parámetros de asignación de golpes

Cuando la aplicación haya creado un mapa de impactos y establezca el contenido de cada píxel, puede prepararse para su representación mediante la configuración de parámetros de asignación de golpes. Los parámetros de asignación de golpes incluyen establecer las texturas necesarias y sus operaciones de fusión, así como los controles de transformación y luminancia para el propio mapa de golpes.

  1. Establezca el mapa de texturas base si se usa, aumenta el mapa y las texturas del mapa de entorno en fases de combinación de texturas.
  2. Establezca las operaciones de combinación alfa y de color para cada fase de textura.
  3. Establezca la matriz de transformación de mapa de impactos.
  4. Establezca los valores de escala y desplazamiento de la luminancia según sea necesario.

En el ejemplo de código siguiente se establecen tres texturas (el mapa de textura base, el mapa de golpes y un mapa de entorno especular) en las fases de combinación de texturas adecuadas.

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

Después de establecer las texturas en sus fases de fusión, el ejemplo de código siguiente prepara las operaciones de mezcla y los argumentos de cada 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 );

Cuando se establecen las operaciones de mezcla y los argumentos, en el ejemplo de código siguiente se establece la matriz de asignación de 2x2 en la matriz de identidades estableciendo el D3DTSS_BUMPENVMAPMAT00 y los miembros D3DTSS_BUMPENVMAPMAT11 de D3DTEXTURESTAGESTATETYPE en 1.0. Establecer la matriz en la identidad hace que el sistema use los valores delta en el mapa de aumento sin modificar, pero esto no es 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) );

Si establece la operación de asignación de golpes para incluir la luminancia (D3DTOP_BUMPENVMAPLUMINANCE), debe establecer los controles de luminancia. Los controles de luminancia configuran cómo el sistema calcula la luminancia antes de modular el color de la textura en la siguiente fase. Para obtener más información, 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) );

Una vez que la aplicación configura los parámetros de asignación de golpes, puede representarse como normal y los polígonos representados reciben efectos de asignación de golpes.

Tenga en cuenta que en el ejemplo anterior se muestran los parámetros establecidos para la asignación de entorno especular. Al realizar la asignación de luz difusa, las aplicaciones establecen la operación de fusión de texturas de la última fase en D3DTOP_MODULATE. Para obtener más información, vea Mapas de luz difusos (Direct3D 9).

Asignación de golpes