Niebla de vértices (Direct3D 9)

Cuando el sistema realiza el fogging de vértices, aplica cálculos de niebla en cada vértice de un polígono y, a continuación, interpola los resultados a través de la cara del polígono durante la rasterización. Los efectos de niebla de vértices se calculan mediante el motor de iluminación y transformación Direct3D. Para obtener más información, vea Parámetros de niebla (Direct3D 9) .

Si la aplicación no usa Direct3D para la transformación y la iluminación, la aplicación debe realizar cálculos de niebla. En este caso, coloque el factor de niebla que se calcula en el componente alfa del color especular para cada vértice. Puede usar las fórmulas que desee, basadas en intervalos, volumétricos o de otro modo. Direct3D usa el factor de niebla proporcionado para interpolar a través de la cara de cada polígono. Las aplicaciones que realizan su propia transformación e iluminación también deben realizar sus propios cálculos de niebla de vértices. Como resultado, esta aplicación solo necesita habilitar la fusión de niebla y establecer el color de niebla a través de los estados de representación asociados, como se describe en Fusión de niebla (Direct3D 9) y Color de niebla (Direct3D 9).

Nota

Al usar un sombreador de vértices, debe usar niebla de vértices. Esto se logra mediante el sombreador de vértices para escribir la intensidad de niebla por vértice en el registro oFog. Una vez completado el sombreador de píxeles, los datos de oFog se usan para interpolar linealmente con el color de niebla. Esta intensidad no está disponible en un sombreador de píxeles.

 

Range-Based Niebla

Nota

Direct3D usa cálculos de niebla basados en rango solo cuando se usa niebla de vértices con el motor de transformación e iluminación de Direct3D. Esto se debe a que la niebla de píxeles se implementa en el controlador del dispositivo y actualmente no existe ningún hardware para admitir niebla basada en intervalos de píxeles. Si la aplicación realiza su propia transformación e iluminación, debe realizar sus propios cálculos de niebla, basados en intervalos o de otro modo.

 

A veces, el uso de niebla puede introducir artefactos gráficos que hacen que los objetos se combinen con el color de niebla de maneras no adecuadas. Por ejemplo, imagine una escena en la que hay dos objetos visibles: uno lo suficientemente distante como para verse afectado por la niebla y el otro lo suficientemente cercano como para no verse afectado. Si el área de visualización gira en su lugar, los efectos de niebla aparentes pueden cambiar, incluso si los objetos están estacionados. En el diagrama siguiente se muestra una vista de arriba abajo de esta situación.

diagrama de dos puntos de vista y cómo afectan a la niebla para dos objetos

La niebla basada en rangos es otra manera, más precisa, de determinar los efectos de niebla. En niebla basada en rango, Direct3D usa la distancia real desde el punto de vista a un vértice para sus cálculos de niebla. Direct3D aumenta el efecto de niebla a medida que aumenta la distancia entre los dos puntos, en lugar de la profundidad del vértice dentro de la escena, lo que evita artefactos rotacionales.

Si el dispositivo actual admite niebla basada en intervalos, establecerá el valor D3DPRASTERCAPS_FOGRANGE en el miembro RasterCaps de D3DCAPS9 cuando llame al método IDirect3DDevice9::GetDeviceCaps . Para habilitar la niebla basada en intervalos, establezca el estado de representación del D3DRS_RANGEFOGENABLE en TRUE.

Direct3D calcula la niebla basada en rangos durante la transformación y la iluminación. Las aplicaciones que no usan la transformación y el motor de iluminación de Direct3D también deben realizar sus propios cálculos de niebla de vértices. En este caso, proporcione el factor de niebla basado en rango en el componente alfa del componente especular para cada vértice.

Uso de niebla de vértices

Siga estos pasos para habilitar la niebla de vértices en la aplicación.

  1. Habilite la fusión de niebla estableciendo D3DRS_FOGENABLE en TRUE.
  2. Establezca el color de niebla en el estado de representación D3DRS_FOGCOLOR.
  3. Elija la fórmula de niebla deseada estableciendo el estado de representación D3DRS_FOGVERTEXMODE en un miembro del tipo enumerado D3DFOGMODE .
  4. Establezca los parámetros de niebla según sea necesario para la fórmula de niebla seleccionada en los estados de representación.

En el ejemplo siguiente, escrito en C++, se muestra el aspecto que podrían tener estos pasos en el código.

// For brevity, error values in this example are not checked 
//   after each call. A real-world application should check 
//   these values appropriately.
//
// For the purposes of this example, g_pDevice is a valid
//   pointer to an IDirect3DDevice9 interface.
void SetupVertexFog(DWORD Color, DWORD Mode, BOOL UseRange, FLOAT Density)
{
    float Start = 0.5f,    // Linear fog distances
          End   = 0.8f;
 
    // Enable fog blending.
    g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
 
    // Set the fog color.
    g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
    
    // Set fog parameters.
    if(D3DFOG_LINEAR == Mode)
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
        g_pDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
    }
    else
    {
        g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
        g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
    }

    // Enable range-based fog if desired (only supported for
    //   vertex fog). For this example, it is assumed that UseRange
    //   is set to a nonzero value only if the driver exposes the 
    //   D3DPRASTERCAPS_FOGRANGE capability.
    // Note: This is slightly more performance intensive
    //   than non-range-based fog.
    if(UseRange)
        g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);
}

Algunos parámetros de niebla son necesarios como valores de punto flotante, aunque el método IDirect3DDevice9::SetRenderState solo acepta valores DWORD en el segundo parámetro. En este ejemplo se proporcionan correctamente los valores de punto flotante a estos métodos sin traducción de datos mediante la conversión de las direcciones de las variables de punto flotante como punteros DWORD y, a continuación, desreferenciarlas.

Tipos de niebla