卷纹理是像素(纹素)的三维集合,可用于绘制二维基元(如三角形或线条)。 基元的每个顶点都需要三个元素纹理坐标,该顶点使用卷进行纹理。 绘制基元时,每个包含的像素都填充卷内某些像素的颜色值,这与二维纹理大小写类似。 卷不会直接呈现,因为没有可以用它们绘制的三维基元。
可以将音量纹理用于特殊效果,例如修补雾、爆炸等。
卷组织成切片,可视为宽度 x 高度 2D 图面堆积,使宽度 x 高度 x 深度卷。 每个切片都是一行。 卷可以具有后续级别,其中每个级别的维度截断为上一级别维度的一半。 下图显示了具有多个级别的卷纹理的外观。
创建卷纹理
下面的代码示例显示了使用卷纹理所需的步骤。
首先,指定一个自定义顶点类型,每个顶点具有三个纹理坐标,如本代码示例所示。
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();
}
相关主题