Partilhar via


Névoa de vértice (Direct3D 9)

Quando o sistema executa nebulização de vértice, ele aplica cálculos de névoa em cada vértice em um polígono e, em seguida, interpola os resultados através da face do polígono durante a rasterização. Os efeitos de névoa do vértice são calculados pelo mecanismo de iluminação e transformação Direct3D. Para obter mais informações, consulte Parâmetros de névoa (Direct3D 9).

Se seu aplicativo não usa Direct3D para transformação e iluminação, o aplicativo deve executar cálculos de névoa. Neste caso, coloque o fator de névoa que é calculado no componente alfa da cor especular para cada vértice. Você é livre para usar as fórmulas que quiser - baseadas em intervalo, volumétrica ou de outra forma. O Direct3D usa o fator de névoa fornecido para interpolar a face de cada polígono. Aplicativos que executam sua própria transformação e iluminação também devem executar seus próprios cálculos de névoa de vértice. Como resultado, tal aplicativo só precisa habilitar a mistura de névoa e definir a cor da névoa através dos estados de renderização associados, conforme descrito em de mistura de névoa (Direct3D 9) e Cor de névoa (Direct3D 9).

Observação

Ao usar um sombreador de vértice, você deve usar névoa de vértice. Isso é feito usando o sombreador de vértice para gravar a intensidade da névoa por vértice no registro oFog. Após a conclusão do sombreador de pixel, os dados oFog são usados para interpolar linearmente com a cor do nevoeiro. Essa intensidade não está disponível em um sombreador de pixel.

 

Range-Based Neblina

Observação

O Direct3D usa cálculos de neblina baseados em alcance somente ao usar névoa de vértice com o mecanismo de transformação e iluminação do Direct3D. Isso ocorre porque a névoa de pixel é implementada no driver de dispositivo e nenhum hardware existe atualmente para suportar a névoa baseada em intervalo de pixels. Se seu aplicativo executa sua própria transformação e iluminação, ele deve executar seus próprios cálculos de neblina, com base no intervalo ou de outra forma.

 

Às vezes, o uso de névoa pode introduzir artefatos gráficos que fazem com que os objetos sejam misturados com a cor da névoa de maneiras não intuitivas. Por exemplo, imagine uma cena em que há dois objetos visíveis: um distante o suficiente para ser afetado pelo nevoeiro e o outro perto o suficiente para não ser afetado. Se a área de visualização rodar no lugar, os efeitos de nevoeiro aparente podem mudar, mesmo que os objetos estejam parados. O diagrama a seguir mostra uma visão de cima para baixo de tal situação.

diagrama de dois pontos de vista e como eles afetam a névoa de dois objetos

O nevoeiro baseado no alcance é outra forma mais precisa de determinar os efeitos do nevoeiro. No nevoeiro baseado em intervalo, o Direct3D usa a distância real do ponto de vista a um vértice para seus cálculos de névoa. O Direct3D aumenta o efeito da névoa à medida que a distância entre os dois pontos aumenta, em vez da profundidade do vértice dentro da cena, evitando assim artefatos rotacionais.

Se o dispositivo atual suportar névoa baseada em intervalo, ele definirá o valor de D3DPRASTERCAPS_FOGRANGE no membro RasterCaps do D3DCAPS9 quando você chamar o IDirect3DDevice9::GetDeviceCaps método. Para habilitar a névoa baseada em intervalo, defina o estado de renderização D3DRS_RANGEFOGENABLE como TRUE.

A névoa baseada em alcance é calculada pelo Direct3D durante a transformação e a iluminação. Os aplicativos que não usam o mecanismo de transformação e iluminação Direct3D também devem executar seus próprios cálculos de névoa de vértice. Neste caso, forneça o fator de névoa baseado em intervalo no componente alfa do componente especular para cada vértice.

Usando Vertex Fog

Use as etapas a seguir para habilitar a névoa de vértice em seu aplicativo.

  1. Habilite a mistura de névoa definindo D3DRS_FOGENABLE como TRUE.
  2. Defina a cor da névoa no estado de renderização D3DRS_FOGCOLOR.
  3. Escolha a fórmula de névoa desejada definindo o estado de renderização de D3DRS_FOGVERTEXMODE como um membro do tipo enumerado D3DFOGMODE.
  4. Defina os parâmetros de névoa conforme desejado para a fórmula de névoa selecionada nos estados de renderização.

O exemplo a seguir, escrito em C++, mostra como essas etapas podem parecer no 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);
}

Alguns parâmetros de névoa são necessários como valores de ponto flutuante, mesmo que o métodoIDirect3DDevice9::SetRenderStatesó aceite valores DWORD no segundo parâmetro. Este exemplo fornece com êxito os valores de ponto flutuante para esses métodos sem conversão de dados, convertendo os endereços das variáveis de ponto flutuante como ponteiros DWORD e, em seguida, desreferenciando-os.

Tipos de névoa