Igrodely átlátszó tárgyak
1. rész
Bevezetés.
Jó napot, elvtársak!
Ebben a cikkben szeretnék látni egy ilyen csodálatos hatása, mint az átláthatóság. Számos módja van, hogy adjunk az átláthatóság a jelenetet, úgy néhány közülük. de egy kicsit később, előbb szeretnék egy kicsit távol a téma, és beszélni, hogyan kell írni egy példát, így nem volt túl sok kérdés;)
Nem zavarja, hogy az írás alkalmazás keretrendszer, szoktam D3DFramework, ami jön DX9SDK és fel lehet használni, hogy könnyen teremt szerény alkalmazások (mint a miénk). I létrehozásához használt DX9Appwizard keretben.
Továbbá, mivel én vagyok rettenetesen lusta ember, a doboz, amely fel van húzva a példa, nem akartam felhívni rendezi és használt D3DXCreateBox () függvényt. Ezután segítségével CloneMesh () metódus interfész ID3DXMesh tettem a dobozt a jobb vertex formában, az úton, a vertex formátum bemutatása nem a FVF és segítségével Vertex Nyilatkozat (ha bármilyen kérdése van ebben a kérdésben, kérem a fórum, beszélgetés :). Azt is festett a háttérben, így tisztán látni a munkát az egyik vagy másik módszer.
Mint minden azt mondta, most már valóban ez a helyzet.
Mi alpha blending (alpha blending)?
Alpha blending megjelenítéséhez használt képeket, amelyben van egy átlátszó vagy áttetsző képpont. Amellett, hogy a vörös, zöld és kék szín komponense minden képpont lehet „átlátható” komponenst, amely a népszerű nevezik az alfa-csatorna (alfa-csatorna). Alpha csatorna jellemzően annyi biten vannak alapszín csatornán. Például, nyolc-bites alfa csatorna lehet 256 szintű átláthatóság, 0-tól (teljesen átlátszó pixel) és 255 (pixel nem teljesen átlátszó).
Annak érdekében, hogy alpha blending, Direct3D telepíteni kell D3DRS_ALPHABLENDENABLE paraméter TRUE:
m_pd3dDevice-> SetRenderState (D3DRS_ALPHABLENDENABLE, TRUE);
A Direct3D színe lehet meghatározni alkalmazásával alfa csatorna (RGBA), és anélkül, hogy (RGB). Transparency lehet jelen a tetejét az anyag szerkezetét. Ön is használja a frame buffer (frame buffer), hogy némi hatása.
Nézzük meg ezeket a módszereket.
Alpha csatorna csúcsok
Módszer neve önmagáért beszél. Alpha channel fogjuk tárolni minden objektum csúcs. Annak érdekében, hogy ezt a módszert, be kell állítani a paramétert D3DRS_DIFFUSEMATERIALSOURCE D3DMCS_COLOR1. Ily módon ad, hogy megértsük, hogy szeretnénk használni a szín a vertex adatok helyett az anyag.
m_pd3dDevice-> SetRenderState (D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
Nézzük meg, mi van a következő paraméterekkel:
D3DRS_DIFFUSEMATERIALSOURCE - meghatározza tékforrás világítási számítások. Lehet, hogy a következő értékeket:
D3DMCS_MATERIAL - használja ki a színt a jelenlegi anyagi
D3DMCS_COLOR1 - a diffúz szín a felső
D3DMCS_COLOR2 - a tükröződő színt a felső
Az alapértelmezett beállítás D3DMCS_COLOR1.
Azt is meg kell, hogy egyértelmű a Direct3D, szeretnénk színezni a csúcsok részt vesz a renderelés világítás. Ez úgy történik, az alábbiak szerint:
m_pd3dDevice-> SetRenderState (D3DRS_COLORVERTEX, TRUE);
Elvileg ez az alapértelmezett állapot áll, hogy igaz, de minden tüzet kell tenni.
Most mi kell hozzá alfa csatornát minden a mi a doboz tetején:
BoxVertex * pVertices;
m_pBoxVB-> Lock (0, 0, (void **) pVertices, 0);
WORD t;
// Add alpha értéket csúcsok
a (t = 0; t
Alapértelmezett csatorna első pár szám. Az egyszerűség kedvéért, akkor használjon egy makrót D3DCOLOR_ARGB (alfa, piros, zöld, kék). Minden egyes makro paraméter lehet egy értéket 0 és 255.
Több nem fogom vizsgálni a vertex formátumban, ez nem tárgya ennek a papír, de a lényeg, ha kérdése van, kérje a fórumon, biztos, hogy válaszolni.
Ennyi az egész most kezd elindulni a kívánt állapot a renderelő pipeline, levonhatjuk a dobozban:
m_pd3dDevice-> SetVertexDeclaration (m_pBoxDeclaration);
m_pd3dDevice-> SetStreamSource (0, m_pBoxVB, 0, 28);
m_pd3dDevice-> SetIndices (m_pBoxIB);
m_pd3dDevice-> DrawIndexedPrimitive (D3DPT_TRIANGLELIST, 0,
0, m_dwNumVertices,
0, m_dwPrimitivesCount);
És itt az eredmény:
Alfa csatornát az anyag
Mi lehet meghatározni alfa csatornát, és az anyagban. Létrehozásához ezt az anyagot, amely a következőket tartalmazza:
D3DMATERIAL9 mtrl;
ZeroMemory ( mtrl, sizeof (mtrl));
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 0.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 0.7f; //<<-- степень прозрачности.
Ahhoz, hogy a módszert, amelyre D3DRS_DIFFUSEMATERIALSOURCE D3DMCS_MATERIAL:
m_pd3dDevice-> SetRenderState (D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
Ez minden. Emlékezetes beállítani a dolgainkat, rajzoljon egy doboz, és meglátjuk, mi történik.