卷纹理资源 (Direct3D 9)
体积纹理是像素 (纹素) 的三维集合,可用于绘制二维基元(如三角形或线条)。 要用体积纹理进行纹理的基元的每个顶点都需要三元素纹理坐标。 绘制基元时,每个包含的像素都根据类似于二维纹理大小写的规则,使用卷内某个像素的颜色值填充。 卷不会直接呈现,因为没有三维基元可以用它们绘制。
可以使用体积纹理进行特殊效果,如斑点雾、爆炸等。
卷被组织成切片,可以视为宽度 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();
}
相关主题