Freigeben über


Volume Texture Resources (Direct3D 9)

Volumentexturen sind dreidimensionale Auflistungen von Pixeln (Texeln), die verwendet werden können, um einen zweidimensionalen Grundtyp wie ein Dreieck oder eine Linie zu zeichnen. Drei-Element-Texturkoordinaten sind für jeden Scheitelpunkt eines Grundtyps erforderlich, der mit einem Volume strukturiert werden soll. Wie der Grundtyp gezeichnet wird, wird jedes enthaltene Pixel mit dem Farbwert von einigen Pixeln innerhalb des Volumes gefüllt, entsprechend den Regeln, die dem zweidimensionalen Texturfall entsprechen. 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 patchy Fog, Explosionen usw. verwenden.

Volumes sind in Segmente angeordnet und können als Gestapelte Breite x Höhe 2D-Oberflächen betrachtet werden, um eine Breite x Höhe x Tiefenvolumen zu erzielen. Jedes Segment ist eine einzelne Zeile. Volumes können nachfolgende Ebenen aufweisen, in denen die Dimensionen der einzelnen Ebenen auf die Hälfte der Dimensionen der vorherigen Ebene abgeschnitten werden. Das folgende Diagramm zeigt, wie eine Volumentextur mit mehreren Ebenen aussieht.

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

Erstellen einer Volumetextur

Die folgenden Codebeispiele zeigen die Schritte, die erforderlich sind, um eine Volumetextur zu verwenden.

Geben Sie zunächst einen benutzerdefinierten Vertextyp mit drei Texturkoordinaten für jeden Scheitelpunkt an, 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 aus.

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 Scheitelpunktpuffer, und füllen Sie ihn mit Daten aus den Scheitelpunkten aus.

Der nächste Schritt besteht darin, die IDirect3DDevice9::CreateVolumeTexture Methode zum Erstellen einer Volumetextur zu verwenden, 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