Megosztás a következőn keresztül:


Pixel Köd (Direct3D 9)

A Pixel-köd neve abból a tényből származik, hogy képpontonként van kiszámítva az eszközillesztőben. Ez eltér a csúcsok ködétől, amelyet a folyamat az átalakítás és a világítás számítása során számít ki. A pixeles ködet néha tábla ködnek is nevezik, mert egyes illesztőprogramok előre kiszámított keresési táblázatot használnak a ködtényező meghatározásához, az egyes képpontok mélységének használatával a számítások keveréséhez. Alkalmazható a D3DFOGMODE számba vehető típus tagjai által azonosított ködképletekkel. Ezeknek a képleteknek az implementációi illesztőprogram-specifikusak. Ha egy illesztő nem támogatja az összetett ködképleteket, az kevésbé összetett képletre csökken.

Eye-Relative és Z-alapú mélység

Annak érdekében, hogy enyhítse a ködhöz kapcsolódó grafikus összetevőket, amelyeket a z értékek egyenetlen eloszlása okoz egy mélységi pufferben, a legtöbb hardvereszköz a z-alapú mélységértékek helyett szem-relatív mélységet használ a képpontfelhőhöz. A szem relatív mélysége lényegében egy homogén koordinátakészlet w eleme. A Microsoft Direct3D az RHW-elem reciprokát egy eszköztérkoordináta-készletből veszi át a valódi w reprodukálásához. Ha egy eszköz támogatja a szem relatív ködét, akkor a D3DCAPS9 szerkezet RasterCaps tagjában állítja be a D3DPRASTERCAPS_WFOG jelzőt, amikor meghívja a IDirect3DDevice9::GetDeviceCaps metódust. A referencia raszterizátor kivételével a szoftvereszközök mindig z használatával számítják ki a képpontok ködeffektusait.

Ha a szem-relatív köd támogatott, a rendszer automatikusan szem-relatív mélységet használ a z-alapú mélység helyett, ha a megadott vetítési mátrix olyan z-értékeket állít elő a világtérben, amelyek egyenértékűek az eszköztér w-értékeivel. A vetítési mátrixot az IDirect3DDevice9::SetTransform metódus meghívásával állíthatja be a D3DTS_PROJECTION értékkel, és átad egy D3DMATRIX struktúrát, amely a kívánt mátrixot jelöli. Ha a vetítési mátrix nem felel meg ennek a követelménynek, a ködeffektusok nem lesznek megfelelően alkalmazva. A megfelelő mátrixok előállításáról további információt a Projection Transform (Direct3D 9)című témakörben talál.

A Direct3D a w-alapú mélységszámításokban a jelenleg beállított vetítési mátrixot használja. Ennek eredményeképpen az alkalmazásnak egy megfelelő vetítési mátrixot kell beállítania a kívánt w-alapú funkciók fogadásához, még akkor is, ha nem használja a Direct3D transzformációs folyamatot.

A Direct3D ellenőrzi a vetítési mátrix negyedik oszlopát. Ha az együtthatók [0,0,0,1] (affine-vetület esetén) a rendszer z-alapú mélységi értékeket fog használni a ködhöz. Ebben az esetben meg kell adnia a lineáris ködeffektusok kezdő és záró távolságait is az eszköztérben, amely a legközelebbi ponttól a felhasználóig 0,0, a legtávolabbi pontnál pedig 1,0 lehet.

A Pixel Köd használata

Az alábbi lépésekkel engedélyezheti a képpontok ködét az alkalmazásban.

  1. A ködkeverés engedélyezéséhez állítsa a D3DRS_FOGENABLE renderelési állapotot a TRUE .
  2. Állítsa be a kívánt ködszínt a D3DRS_FOGCOLOR renderelési állapotban.
  3. Válassza ki a használni kívánt ködképletet úgy, hogy a D3DRS_FOGTABLEMODE renderelési állapotát a D3DFOGMODE számbavételi típus megfelelő tagjára állítja.
  4. Állítsa be a ködparamétereket a kívánt módon a kijelölt köd módhoz a kapcsolódó renderelési állapotokban. Ez magában foglalja a lineáris köd kezdő és záró távolságait, valamint az exponenciális köd üzemmód ködsűrűségét.

Az alábbi példa bemutatja, hogyan nézhetnek ki ezek a lépések a kódban.

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

Egyes ködparaméterek lebegőpontos értékekként szükségesek, annak ellenére, hogy a IDirect3DDevice9::SetRenderState metódus csak a második paraméter DWORD-értékeit fogadja el. Az előző példa az IDirect3DDevice9::SetRenderState adatfordítás nélkül lebegőpontos értékeket adja meg úgy, hogy a lebegőpontos változók címét DWORD-mutatóként adja meg, majd elhalasztja őket.

ködtípusok