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, consulte 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 cualquier fórmula que desee: basada 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 iluminación y transformación 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 por píxel. Si la aplicación realiza su propia transformación e iluminación, debe realizar sus propios cálculos de niebla, basados en intervalos o en caso contrario.
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 inintuitivas. Por ejemplo, imagine una escena en la que hay dos objetos visibles: una lo suficientemente distante como para verse afectada por la niebla y la otra lo suficientemente cercana como para no verse afectada. Si el área de visualización gira en su lugar, los efectos de niebla aparentes pueden cambiar, incluso si los objetos están fijos. En el diagrama siguiente se muestra una vista de arriba abajo de esta situación.
La niebla basada en rangos es otra manera, más precisa, de determinar los efectos de niebla. En la niebla basada en intervalos, 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 la niebla a medida que aumenta la distancia entre los dos puntos, en lugar de la profundidad del vértice dentro de la escena, evitando así artefactos rotacionales.
Si el dispositivo actual admite niebla basada en intervalos, establecerá el valor D3DPRASTERCAPS_FOGRANGE en el miembro RasterCaps de D3DCAPS9 al llamar al método IDirect3DDevice9::GetDeviceCaps. Para habilitar la niebla basada en intervalos, establezca el estado de representación del D3DRS_RANGEFOGENABLE en TRUE.
La niebla basada en rangos se calcula mediante Direct3D durante la transformación y la iluminación. Las aplicaciones que no usan la transformación Direct3D y el motor de iluminación 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.
- Habilite la fusión de niebla estableciendo D3DRS_FOGENABLE en TRUE.
- Establezca el color de niebla en el D3DRS_FOGCOLOR estado de representación.
- Elija la fórmula de niebla deseada estableciendo el D3DRS_FOGVERTEXMODE estado de representación en un miembro del tipo enumerado D3DFOGMODE.
- Establezca los parámetros de niebla como desee para la fórmula de niebla seleccionada en los estados de representación.
En el ejemplo siguiente, escrito en C++, se muestra el aspecto de 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. Este ejemplo proporciona 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, desreferenciarlos.
Temas relacionados