次の方法で共有


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

ボリューム テクスチャーは、三角形や線などの 2D プリミティブを描画するために使用できる 3 次元のピクセル (テクセル) の集合です。ボリュームでテクスチャー処理されるプリミティブの各頂点には、3 要素のテクスチャー座標が必要です。プリミティブを描画する際、その中の各ピクセルには、2D テクスチャーの場合と同様の規則に従って、ボリューム内のピクセルのカラー値が格納されます。ボリュームを使用して描画できる 3D プリミティブはないので、ボリュームは直接レンダリングされません。

ボリューム テクスチャーは、むらのあるフォグや爆発などの特殊効果に使用することができます。

ボリュームはスライスに分類され、幅 × 高さの 2D サーフェスがスタックされて、幅 × 高さ × 奥行きのボリュームを構成すると考えることができます。各スライスの行は、1 行です。ボリュームは下位のレベルを持つことができ、各レベルのサイズは直前のレベルの半分のサイズになります。次の図は、複数のレベルを持つボリューム テクスチャーの概念を表したものです。

Volume texture with 8x2x4, 4x1x2, and 2x1x1 cube representations

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

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

まず、次のコード例のように、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();
}