Pixel fog (Direct3D 9)
Pixelmist krijgt de naam van het feit dat deze per pixel wordt berekend in het apparaatstuurprogramma. Dit verschilt van de hoekpuntmist, die door de pijplijn wordt berekend tijdens transformatie- en verlichtingsberekeningen. Pixelmist wordt ook wel tabelmist genoemd omdat sommige stuurprogramma's een vooraf berekende opzoektabel gebruiken om de mistfactor te bepalen, met behulp van de diepte van elke pixel om toe te passen in gemengde berekeningen. Deze kan worden toegepast met behulp van een mistformule die wordt geïdentificeerd door leden van het D3DFOGMODE geïnventariseerd type. De implementaties van deze formules zijn stuurprogrammaspecifiek. Als een stuurprogramma geen complexe mistformule ondersteunt, moet deze afnemen tot een minder complexe formule.
Eye-Relative versus Z-gebaseerde diepte
Om mistgerelateerde grafische artefacten te verlichten die worden veroorzaakt door ongelijke verdeling van z-waarden in een dieptebuffer, gebruiken de meeste hardwareapparaten oog-relatieve diepte in plaats van z-gebaseerde dieptewaarden voor pixelmist. De relatieve oogdiepte is in wezen het w-element uit een homogene coördinaatset. Microsoft Direct3D neemt de wederkerigheid van het RHW-element van een apparaatruimtecoördinaat ingesteld om true w te reproduceren. Als een apparaat oog-relatieve mist ondersteunt, wordt de vlag D3DPRASTERCAPS_WFOG ingesteld in het RasterCaps-lid van de D3DCAPS9 structuur wanneer u de methode IDirect3DDevice9::GetDeviceCaps aanroept. Met uitzondering van de referentierasterizer gebruiken softwareapparaten altijd z om pixelmisteffecten te berekenen.
Wanneer oog-relatieve mist wordt ondersteund, gebruikt het systeem automatisch oog-relatieve diepte in plaats van z-gebaseerde diepte als de meegeleverde projectiematrix z-waarden produceert in de wereldruimte die gelijk is aan w-waarden in apparaatruimte. U stelt de projectiematrix in door de methode IDirect3DDevice9::SetTransform aan te roepen met behulp van de D3DTS_PROJECTION-waarde en een D3DMATRIX structuur door te geven die de gewenste matrix vertegenwoordigt. Als de projectiematrix niet aan deze vereiste voldoet, worden misteffecten niet correct toegepast. Zie Projectietransformatie (Direct3D 9)voor meer informatie over het produceren van een compatibele matrix.
Direct3D maakt gebruik van de huidige set projectiematrix in de op w gebaseerde diepteberekeningen. Als gevolg hiervan moet een toepassing een compatibele projectiematrix instellen om de gewenste w-gebaseerde functies te ontvangen, zelfs als deze de Direct3D-transformatiepijplijn niet gebruikt.
Direct3D controleert de vierde kolom van de projectiematrix. Als de coëfficiënten [0,0,0,1] (voor een affinusprojectie) zijn, gebruikt het systeem op z gebaseerde dieptewaarden voor mist. In dit geval moet u ook de begin- en eindafstanden opgeven voor lineaire misteffecten in de apparaatruimte, die varieert van 0,0 op het dichtstbijzijnde punt naar de gebruiker en 1,0 op het dichtstbijzijnde punt.
Pixel mist gebruiken
Gebruik de volgende stappen om pixelmist in te schakelen in uw toepassing.
- Schakel mistmixing in door de D3DRS_FOGENABLE renderstatus in te stellen op TRUE-.
- Stel de gewenste mistkleur in de D3DRS_FOGCOLOR weergavestatus in.
- Kies de mistformule die u wilt gebruiken door de D3DRS_FOGTABLEMODE weergavestatus in te stellen op het overeenkomstige lid van het D3DFOGMODE geïnventariseerd type.
- Stel de mistparameters naar wens in voor de geselecteerde mistmodus in de bijbehorende renderstatussen. Dit omvat de begin- en eindafstanden voor lineaire mist en mistdichtheid voor exponentiële mistmodus.
In het volgende voorbeeld 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 SetupPixelFog(DWORD Color, DWORD Mode)
{
float Start = 0.5f; // For linear mode
float End = 0.8f;
float Density = 0.66f; // For exponential modes
// Enable fog blending.
g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
// Set the fog color.
g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color);
// Set fog parameters.
if( Mode == D3DFOG_LINEAR )
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End));
}
else
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
Sommige mistparameters zijn vereist als drijvendekommawaarden, ook al accepteert de methode IDirect3DDevice9::SetRenderState alleen DWORD-waarden in de tweede parameter. In het voorgaande voorbeeld worden de drijvende-kommawaarden IDirect3DDevice9::SetRenderState zonder gegevensomzetting door de adressen van de drijvendekommavariabelen als DWORD-aanwijzers uit te gieten en deze vervolgens uit te stellen.
Verwante onderwerpen