ボリューム テクスチャ リソース (Direct3D 9)

ボリューム テクスチャは、三角形や線などの 2 次元プリミティブを描画するために使用できるピクセル (テクセル) の 3 次元コレクションです。 ボリュームでテクスチャ処理するプリミティブの各頂点には、3 要素のテクスチャ座標が必要です。 プリミティブが描画されると、含まれる各ピクセルは、2 次元テクスチャ ケースに似たルールに従って、ボリューム内の一部のピクセルからの色値で塗りつぶされます。 ボリュームは、塗りつぶすことができる 3 次元プリミティブがないため、直接レンダリングされません。

ボリューム テクスチャは、パッチが適用された霧、爆発などの特殊効果に使用できます。

ボリュームはスライスに編成され、幅 x 高さ 2D サーフェスを積み重ねて、幅 x 高さ x 奥行きボリュームを作成すると考えることができます。 各スライスは 1 行です。 ボリュームには、各レベルのディメンションが前のレベルのディメンションの半分に切り捨てられる後続のレベルを含めることができます。 次の図は、複数のレベルを持つボリューム テクスチャがどのように見えるかを示しています。

8x2x4、4x1x2、および 2x1x1 キューブ表現を含むボリューム テクスチャの図

ボリューム テクスチャの作成

次のコード例は、ボリューム テクスチャを使用するために必要な手順を示しています。

最初に、このコード例に示すように、各頂点に 3 つのテクスチャ座標を持つカスタム頂点の種類を指定します。

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

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

次に、頂点にデータを塗りつぶします。

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

次に、頂点バッファーを作成し、頂点からのデータで埋めます。

次の手順では、このコード例に示すように 、IDirect3DDevice9::CreateVolumeTexture メソッドを使用してボリューム テクスチャを作成します。

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

プリミティブをレンダリングする前に、現在のテクスチャを上記で作成したボリューム テクスチャに設定します。 次のコード例は、三角形のストリップのレンダリング プロセス全体を示しています。

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 テクスチャ