卷纹理资源 (Direct3D 9)

卷纹理是像素(纹素)的三维集合,可用于绘制二维基元(如三角形或线条)。 基元的每个顶点都需要三个元素纹理坐标,该顶点使用卷进行纹理。 绘制基元时,每个包含的像素都填充卷内某些像素的颜色值,这与二维纹理大小写类似。 卷不会直接呈现,因为没有可以用它们绘制的三维基元。

可以将音量纹理用于特殊效果,例如修补雾、爆炸等。

卷组织成切片,可视为宽度 x 高度 2D 图面堆积,使宽度 x 高度 x 深度卷。 每个切片都是一行。 卷可以具有后续级别,其中每个级别的维度截断为上一级别维度的一半。 下图显示了具有多个级别的卷纹理的外观。

具有 8x2x4、4x1x2 和 2x1x1 多维数据集表示形式的音量纹理图

创建卷纹理

下面的代码示例显示了使用卷纹理所需的步骤。

首先,指定一个自定义顶点类型,每个顶点具有三个纹理坐标,如本代码示例所示。

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 纹理