Udostępnij za pośrednictwem


Zasoby tekstury woluminu (Direct3D 9)

Tekstury objętości są trójwymiarowymi kolekcjami pikseli (texels), których można użyć do malowania dwuwymiarowego elementu pierwotnego, takiego jak trójkąt lub linia. Współrzędne tekstury trójelementowej są wymagane dla każdego wierzchołka pierwotnego, który ma być teksturowany objętością. W miarę rysowania pierwotnego każdy zawarty piksel jest wypełniony wartością koloru z pewnego piksela w woluminie, zgodnie z regułami analogicznymi do dwuwymiarowej wielkości tekstury. Woluminy nie są renderowane bezpośrednio, ponieważ nie ma trójwymiarowych elementów pierwotnych, które można z nimi malować.

Możesz używać tekstur objętościowych do efektów specjalnych, takich jak plamowa mgła, eksplozje itd.

Woluminy są uporządkowane w wycinki i można traktować jako szerokość x wysokość powierzchni 2D ułożone w celu utworzenia szerokości x wysokości x głębokości objętości. Każdy wycinek jest pojedynczym wierszem. Woluminy mogą mieć kolejne poziomy, w których wymiary każdego poziomu są obcinane do połowy wymiarów poprzedniego poziomu. Na poniższym diagramie pokazano, jak wygląda tekstura woluminu z wieloma poziomami.

diagram tekstury objętości z reprezentacjami modułu 8x2x4, 4x1x2 i 2x1x1

Tworzenie tekstury woluminu

W poniższych przykładach kodu przedstawiono kroki wymagane do użycia tekstury woluminu.

Najpierw określ niestandardowy typ wierzchołka, który ma trzy współrzędne tekstury dla każdego wierzchołka, jak pokazano w tym przykładzie kodu.

struct VOLUMEVERTEX
{
    FLOAT x, y, z;
    DWORD color;
    FLOAT tu, tv, tw;
};

#define D3DFVF_VOLUMEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|
                             D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE3(0))

Następnie wypełnij wierzchołki danymi.

VOLUMEVERTEX g_vVertices[4] =
{
    { 1.0f, 1.0f, 0.0f, 0xffffffff, 1.0f, 1.0f, 0.0f },
    {-1.0f, 1.0f, 0.0f, 0xffffffff, 0.0f, 1.0f, 0.0f },
    { 1.0f,-1.0f, 0.0f, 0xffffffff, 1.0f, 0.0f, 0.0f },
    {-1.0f,-1.0f, 0.0f, 0xffffffff, 0.0f, 0.0f, 0.0f }
};

Teraz utwórz bufor wierzchołka i wypełnij go danymi z wierzchołków.

Następnym krokiem jest użycie metody IDirect3DDevice9::CreateVolumeTexture w celu utworzenia tekstury woluminu, jak pokazano w tym przykładzie kodu.

LPDIRECT3DVOLUMETEXTURE9 pVolumeTexture;
d3dDevice->CreateVolumeTexture( 8, 4, 4, 1, 0, D3DFMT_R8G8B8,D3DPOOL_MANAGED, 
                                &pVolumeTexture );

Przed renderowaniem elementu pierwotnego ustaw bieżącą teksturę na teksturę woluminu utworzoną powyżej. Poniższy przykład kodu przedstawia cały proces renderowania dla paska trójkątów.

if( SUCCEEDED( d3dDevice->BeginScene() ) )
{
    // Draw the quad, with the volume texture.
    d3dDevice->SetTexture( 0, pVolumeTexture );
    d3dDevice->SetFVF( D3DFVF_VOLUMEVERTEX );
    d3dDevice->SetStreamSource( 0, pVB, sizeof(VOLUMEVERTEX) );
    d3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2);

   // End the scene.
   d3dDevice->EndScene();
}

tekstury Direct3D