Compartir a través de


Recursos de textura de volumen (Direct3D 9)

Las texturas de volumen son colecciones tridimensionales de píxeles (elementos de textura) que se pueden usar para pintar un primitivo bidimensional, como un triángulo o una línea. Las coordenadas de textura de tres elementos son necesarias para cada vértice de un primitivo que se va a texturar con un volumen. A medida que se dibuja el primitivo, cada píxel contenido se rellena con el valor de color de algún píxel dentro del volumen, de acuerdo con las reglas análogas al caso de textura bidimensional. Los volúmenes no se representan directamente porque no hay primitivos tridimensionales que se puedan pintar con ellos.

Puedes usar texturas de volumen para efectos especiales como niebla, explosiones, etc.

Los volúmenes se organizan en segmentos y se pueden considerar como superficies 2D de ancho x alto apiladas para hacer un ancho x alto x volumen de profundidad. Cada segmento es una sola fila. Los volúmenes pueden tener niveles posteriores en los que las dimensiones de cada nivel se truncan a la mitad de las dimensiones del nivel anterior. En el diagrama siguiente se muestra el aspecto de una textura de volumen con varios niveles.

diagrama de una textura de volumen con representaciones de cubo 8x2x4, 4x1x2 y 2x1x1

Creación de una textura de volumen

Los ejemplos de código siguientes muestran los pasos necesarios para usar una textura de volumen.

En primer lugar, especifique un tipo de vértice personalizado que tenga tres coordenadas de textura para cada vértice, como se muestra en este ejemplo de código.

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

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

A continuación, rellene los vértices con datos.

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

Ahora, cree un búfer de vértices y llene con datos de los vértices.

El siguiente paso consiste en usar el método IDirect3DDevice9::CreateVolumeTexture para crear una textura de volumen, como se muestra en este ejemplo de código.

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

Antes de representar el primitivo, establezca la textura actual en la textura de volumen creada anteriormente. En el ejemplo de código siguiente se muestra todo el proceso de representación de una franja de triángulos.

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

Texturas de Direct3D