ボリューム テクスチャ リソース

ボリューム テクスチャ リソース

ボリューム テクスチャとは、三角形やラインなどの 2D プリミティブの描画に使えるピクセル (テクセル) の 3D の集まりのことである。立体でテクスチャ処理されるプリミティブの各頂点には、3 要素のテクスチャ座標が必要である。プリミティブを描画する場合、各プリミティブに含まれるピクセルには、2D テクスチャの場合と同じような規則に従って、ボリューム内のピクセルの色値が設定される。ボリュームを使って描画できる 3D プリミティブがないため、ボリュームを直接レンダリングすることはできない。

ボリューム テクスチャは、まだらなフォグや爆発などの特殊効果に使える。

ボリュームはスライスにまとめられ、 × 高さの 2D サーフェイスがスタックされて、 × 高さ × 奥行きのボリュームを構成すると考えることができる。各スライスは、単一行である。立体はミップ レベルを持つことができる。各レベルの大きさは、直前レベルの半分の大きさにカットされる。次の図は、複数レベルを持つボリューム テクスチャを示している。

8 × 2 × 4、4 × 1 × 2、2 × 1 × 1 のキューブ表現を持つボリューム テクスチャ

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

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

まず、各頂点に対して 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();
}