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


Csúcsos köd (Direct3D 9)

Amikor a rendszer csúcspont-lecsúszást végez, ködszámításokat alkalmaz a sokszög minden csúcsán, majd interpolálja az eredményeket a sokszög egész arcán a raszterizálás során. A csúcsok ködeffektusait a Direct3D világítási és átalakítási motor számítja ki. További információ: Ködparaméterek (Direct3D 9).

Ha az alkalmazás nem használja a Direct3D-t átalakításhoz és világításhoz, az alkalmazásnak ködszámításokat kell végeznie. Ebben az esetben helyezze el az egyes csúcsok spekuláris színének alfa-összetevőjében kiszámított ködtényezőt. Szabadon használhatja a kívánt képleteket – tartományalapú, mennyiségi vagy egyéb képleteket. A Direct3D a megadott ködtényezőt használja az egyes sokszögek arcának interpolálásához. A saját átalakítást és világítást végző alkalmazásoknak saját csúcsponti ködszámításokat is végre kell hajtaniuk. Ennek eredményeképpen egy ilyen alkalmazásnak csak a ködkeverést kell engedélyeznie, és a kapcsolódó renderelési állapotokon keresztül kell beállítania a köd színét a Ködkeverés (Direct3D 9) és Ködszín (Direct3D 9).

Jegyzet

Csúcsárnyékoló használatakor csúcsos ködet kell használnia. Ez a csúcsok árnyékolójának használatával történik, hogy a csúcsonkénti köd intenzitását az oFog-regiszterbe írja. A képpontárnyékoló befejeződése után az oFog-adatokkal lineárisan interpoláljuk a ködszínt. Ez az intenzitás nem érhető el képpontárnyékolóban.

 

Range-Based köd

Jegyzet

A Direct3D csak akkor használ tartományalapú ködszámításokat, ha csúcsfelszíni ködet használ a Direct3D átalakítási és világítási motorral. Ennek az az oka, hogy pixeles köd van implementálva az eszközillesztőben, és jelenleg nem létezik hardver a képpontonkénti tartományalapú köd támogatására. Ha az alkalmazás saját átalakítást és világítást végez, saját ködszámításokat kell végeznie, tartományalapú vagy más módon.

 

Néha a köd használata olyan grafikus összetevőket eredményezhet, amelyek miatt az objektumok nem eszmélt módon keverednek a köd színével. Képzeljen el például egy jelenetet, amelyben két látható objektum van: az egyik elég távoli ahhoz, hogy a köd befolyásolja, a másik pedig elég közel ahhoz, hogy ne legyen hatással. Ha a látótér a helyén forog, a látszólagos ködhatások akkor is megváltozhatnak, ha az objektumok helyhez kötöttek. Az alábbi ábrán egy ilyen helyzet felülről lefelé látható nézete látható.

két nézőpont diagramja, valamint a két objektum ködre gyakorolt hatásának

A tartományalapú köd egy másik, pontosabb módszer a ködhatások meghatározására. A tartományalapú ködben a Direct3D a nézőpont és a csúcs közötti tényleges távolságot használja a ködszámításokhoz. A Direct3D növeli a köd hatását, mivel a két pont közötti távolság nő, nem pedig a csúcspont mélysége a jelenetben, így elkerülve a forgatási összetevőket.

Ha az aktuális eszköz támogatja a tartományalapú köd használatát, akkor a D3DCAPS9 RasterCaps-tagjának D3DPRASTERCAPS_FOGRANGE értékét állítja be, amikor meghívja az IDirect3DDevice9::GetDeviceCaps metódust. A tartományalapú köd engedélyezéséhez állítsa a D3DRS_RANGEFOGENABLE renderelési állapotot a TRUE .

A tartományalapú ködet a Direct3D számítja ki az átalakítás és a világítás során. A Direct3D átalakítási és világítási motort nem használó alkalmazásoknak saját csúcsok ködszámítását is végre kell hajtaniuk. Ebben az esetben adja meg a tartományalapú ködtényezőt a spekuláris összetevő alfa-összetevőjében minden csúcshoz.

A Csúcspont köd használata

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

  1. A ködkeverés engedélyezéséhez állítsa D3DRS_FOGENABLE TRUEértékre.
  2. Állítsa be a köd színét a D3DRS_FOGCOLOR renderelési állapotban.
  3. Válassza ki a kívánt ködképletet úgy, hogy a D3DRS_FOGVERTEXMODE renderelési állapotát a D3DFOGMODE számbavételi típus egyik tagjára állítja.
  4. Állítsa be a ködparamétereket a kijelölt ködképlethez a renderelési állapotokban.

Az alábbi, C++-ban írt 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 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);
}

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éterben fogadja el a DWORD-értékeket. Ez a példa sikeresen biztosítja a lebegőpontos értékeket ezeknek a metódusoknak adatfordítás nélkül úgy, hogy a lebegőpontos változók címét DWORD-mutatóként adja meg, majd elhalasztja őket.

ködtípusok