Delen via


Hoekpunt mist (Direct3D 9)

Wanneer het systeem hoekpunt fogging uitvoert, past het mistberekeningen toe op elk hoekpunt in een veelhoek en interpoleert vervolgens de resultaten over het gezicht van de veelhoek tijdens rastervorming. Vertex misteffecten worden berekend door de Direct3D verlichtings- en transformatiemotor. Zie Fog Parameters (Direct3D 9)voor meer informatie.

Als uw toepassing geen Direct3D gebruikt voor transformatie en verlichting, moet de toepassing mistberekeningen uitvoeren. In dit geval plaatst u de mistfactor die wordt berekend in het alfa-onderdeel van de speculaire kleur voor elk hoekpunt. U kunt de formules gebruiken die u wilt gebruiken: bereik, volumetric of anderszins. Direct3D gebruikt de meegeleverde mistfactor om het gezicht van elke veelhoek te interpoleren. Toepassingen die hun eigen transformatie en verlichting uitvoeren, moeten ook hun eigen vertex fog berekeningen uitvoeren. Als gevolg hiervan hoeft een dergelijke toepassing alleen mistmengsels in te schakelen en de mistkleur door de bijbehorende renderstatussen in te stellen, zoals beschreven in Fog Blending (Direct3D 9) en Mistkleur (Direct3D 9).

Notitie

Wanneer u een hoekpunt-shader gebruikt, moet u hoekpuntmist gebruiken. Dit wordt bereikt door de hoekpunt-shader te gebruiken om de mistintensiteit per hoekpunt naar het oFog-register te schrijven. Nadat de pixel-shader is voltooid, worden de oFog-gegevens gebruikt om lineair te interpoleren met de mistkleur. Deze intensiteit is niet beschikbaar in een pixel-shader.

 

Range-Based Fog

Notitie

Direct3D maakt alleen gebruik van mistberekeningen op basis van een bereik bij gebruik van hoekpuntmist met de Direct3D-transformatie- en verlichtingsmotor. Dit komt doordat pixelmist wordt geïmplementeerd in het apparaatstuurprogramma en er momenteel geen hardware bestaat ter ondersteuning van mist per pixelbereik. Als uw toepassing zijn eigen transformatie en verlichting uitvoert, moet deze zijn eigen mistberekeningen uitvoeren, op bereik gebaseerd of anderszins.

 

Soms kan het gebruik van mist grafische artefacten introduceren die ervoor zorgen dat objecten op niet-intieve manieren worden gemengd met de mistkleur. Stel bijvoorbeeld een scène voor waarin twee zichtbare objecten zijn: één afstand genoeg om te worden beïnvloed door mist en de andere in de buurt om niet te worden beïnvloed. Als het kijkgebied op zijn plaats draait, kunnen de schijnbare misteffecten veranderen, zelfs als de objecten stationair zijn. In het volgende diagram ziet u een top-down weergave van een dergelijke situatie.

diagram van twee uitkijkpunten en hoe deze van invloed zijn op mist voor twee objecten

Op bereik gebaseerde mist is een andere, nauwkeurigere manier om de misteffecten te bepalen. In op bereik gebaseerde mist gebruikt Direct3D de werkelijke afstand van het uitkijkpunt tot een hoekpunt voor de mistberekeningen. Direct3D verhoogt het effect van mist naarmate de afstand tussen de twee punten toeneemt, in plaats van de diepte van het hoekpunt in de scène, waardoor rotatieartefacten worden vermeden.

Als het huidige apparaat ondersteuning biedt voor mist op basis van bereik, wordt de D3DPRASTERCAPS_FOGRANGE waarde ingesteld in het RasterCaps-lid van D3DCAPS9 wanneer u de methode IDirect3DDevice9::GetDeviceCaps aanroept. Als u op bereik gebaseerde mist wilt inschakelen, stelt u de D3DRS_RANGEFOGENABLE-renderstatus in op TRUE-.

Mist op basis van bereik wordt berekend door Direct3D tijdens transformatie en verlichting. Toepassingen die niet gebruikmaken van de Direct3D-transformatie- en verlichtingsmotor, moeten ook hun eigen vertex mistberekeningen uitvoeren. Geef in dit geval de op bereik gebaseerde mistfactor op in het alfa-onderdeel van het speculaire onderdeel voor elk hoekpunt.

Hoekpuntmist gebruiken

Gebruik de volgende stappen om hoekpuntmist in te schakelen in uw toepassing.

  1. Schakel mistmixing in door D3DRS_FOGENABLE in te stellen op TRUE-.
  2. Stel de mistkleur in de D3DRS_FOGCOLOR weergavestatus in.
  3. Kies de gewenste mistformule door de D3DRS_FOGVERTEXMODE weergavestatus in te stellen op een lid van het D3DFOGMODE geïnventariseerd type.
  4. Stel de mistparameters naar wens in voor de geselecteerde mistformule in de renderstatussen.

In het volgende voorbeeld, geschreven in C++, ziet u hoe deze stappen eruit kunnen zien in code.

// 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);
}

Sommige mistparameters zijn vereist als drijvendekommawaarden, ook al accepteert de methode IDirect3DDevice9::SetRenderState alleen DWORD-waarden in de tweede parameter. In dit voorbeeld worden de drijvende-kommawaarden zonder gegevensomzetting aan deze methoden gegeven door de adressen van de drijvende-kommavariabelen als DWORD-aanwijzers te casten en deze vervolgens uit te stellen.

Misttypen