卷纹理资源 (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 纹理