Compartilhar via


Recursos de textura de volume (Direct3D 9)

Texturas de volume são coleções tridimensionais de pixels (texels) que podem ser usadas para pintar um primitivo bidimensional, como um triângulo ou uma linha. Coordenadas de textura de três elementos são necessárias para cada vértice de um primitivo que deve ser texturizado com um volume. À medida que o primitivo é desenhado, cada pixel contido é preenchido com o valor de cor de algum pixel dentro do volume, de acordo com regras análogas ao caso de textura bidimensional. Os volumes não são renderizados diretamente porque não há primitivos tridimensionais que possam ser pintados com eles.

Você pode usar texturas de volume para efeitos especiais, como neblina irregular, explosões e assim por diante.

Os volumes são organizados em fatias e podem ser considerados como superfícies 2D de largura x altura empilhadas para fazer um volume de largura x altura x profundidade. Cada fatia é uma única linha. Os volumes podem ter níveis subsequentes nos quais as dimensões de cada nível são truncadas para metade das dimensões do nível anterior. O diagrama a seguir mostra a aparência de uma textura de volume com vários níveis.

diagrama de uma textura de volume com representações de cubo 8x2x4, 4x1x2 e 2x1x1

Criando uma textura de volume

Os exemplos de código abaixo mostram as etapas necessárias para usar uma textura de volume.

Primeiro, especifique um tipo de vértice personalizado que tenha três coordenadas de textura para cada vértice, conforme mostrado neste exemplo 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))

Em seguida, preencha os vértices com dados.

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

Agora, crie um buffer de vértice e preencha-o com dados dos vértices.

A próxima etapa é usar o método IDirect3DDevice9::CreateVolumeTexture para criar uma textura de volume, conforme mostrado neste exemplo de código.

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

Antes de renderizar o primitivo, defina a textura atual como a textura do volume criada acima. O exemplo de código abaixo mostra todo o processo de renderização para uma faixa 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 Direct3D