Volumetexturressourcen (Direct3D 9)

Volumentexturen sind dreidimensionale Auflistungen von Pixeln (Texels), die verwendet werden können, um ein zweidimensionales Grundtyp wie ein Dreieck oder eine Linie zu zeichnen. Für jeden Scheitelpunkt eines Grundtyps, der mit einem Volume strukturiert werden soll, sind Drei-Element-Texturkoordinaten erforderlich. Während der Grundtyp gezeichnet wird, wird jedes enthaltene Pixel mit dem Farbwert eines Pixels innerhalb des Volumes gefüllt, in Übereinstimmung mit Regeln, die dem zweidimensionalen Texturfall analog sind. Volumes werden nicht direkt gerendert, da es keine dreidimensionalen Grundtypen gibt, die mit ihnen gezeichnet werden können.

Sie können Volumentexturen für Spezialeffekte wie fleckigen Nebel, Explosionen usw. verwenden.

Volumes werden in Slices organisiert und können als Breite x Höhe 2D-Flächen betrachtet werden, die gestapelt sind, um eine Breite x Höhe x Tiefenvolumen zu erzeugen. Jeder Slice ist eine einzelne Zeile. Volumes können nachfolgende Ebenen aufweisen, in denen die Dimensionen jeder Ebene auf die Hälfte der Dimensionen der vorherigen Ebene abgeschnitten werden. Das folgende Diagramm zeigt, wie eine Volumetextur mit mehreren Ebenen aussieht.

Diagramm einer Volumentextur mit 8x2x4-, 4x1x2- und 2x1x1-Cubedarstellungen

Erstellen einer Volumetextur

Die folgenden Codebeispiele zeigen die Schritte, die zum Verwenden einer Volumetextur erforderlich sind.

Geben Sie zunächst einen benutzerdefinierten Vertextyp an, der drei Texturkoordinaten für jeden Scheitelpunkt aufweist, wie in diesem Codebeispiel gezeigt.

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

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

Füllen Sie als Nächstes die Scheitelpunkte mit Daten.

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

Erstellen Sie nun einen Vertexpuffer, und füllen Sie ihn mit Daten aus den Scheitelpunkten.

Der nächste Schritt besteht darin, die IDirect3DDevice9::CreateVolumeTexture-Methode zu verwenden, um eine Volumetextur zu erstellen, wie in diesem Codebeispiel gezeigt.

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

Legen Sie vor dem Rendern des Grundtyps die aktuelle Textur auf die oben erstellte Volumetextur fest. Das folgende Codebeispiel zeigt den gesamten Renderingprozess für einen Dreiecksstreifen.

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

Direct3D-Texturen