作者:StrongCoding
邮箱:StrongCoding@qq.com DX群:130302441
若文中有误,请告知.十分感谢.一起加油.
这一篇主要说一下渲染的准备流程:
(1) 填充顶点数据信息
(2) 填充索引数据信息
(3) 优化
(4) 渲染
下面具体分步骤实时:
一、填充顶点数据信息:
Mesh->LockVertecisBuffer(...);
// 代码省略
Mesh->UnlockVertecisBuffer(...);
二、填充索引数据信息:
Mesh->LockIndexBuffer(...);
// 代码省略
Mesh->UnlockIndexBuffer(...);
三、优化Mesh
(1) 在优化Mesh之前,我们需要先获取其邻接信息,毕竟邻接信息是优化Mesh的核心关键:
Vector<DWORD> adjacencyBuffer( Mesh->GetNumFaces() * 3 );
Mesh->GenerateAdjacency( 0.0f, &adjacencyBuffer[0] );
(2) 正式优化MESH
Mesh->OptimizeInplace(
D3DXMESHOPT_COMPACT|D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_VERTEXCACHE,
&adjacencyBuffer[0],
0,
0,
0
);
注意:当你指定标记D3DXMESHOPT_ATTRSORT的时候,DX自动为你生成一个D3DXATTRIBUTERANGE结构信息集。
参数说明:
第一个参数:优化标记
第二个参数:没有优化的外部邻接信息数组
第三个参数:输出优化的内部邻接信息数组,不需要设置为0
第四个参数:获取面的重映射信息
第五个参数:获取点的重映射信息
四、渲染:
注意,在此之前你可以将填充的MESH划分为多个子集来进行渲染,这样的好处是,你可以对每个子集自主设置它的纹理、材质 等,这里对于我们掌握该项技术并不是必须的,但是你仍然可以采取以下的方式处理这一效果:
(1) 加锁属性缓存,划分子集
DWORD *attributeInfo = 0;
Mesh->LockAttributeBuffer(0, &attributeInfo);
for( int i = 0; i < 4; ++i )
attributeInfo[i] = 0;
for( int j = 4; j < 8; ++j )
attributeInfo[j] = 1;
for( int k = 8; k < 12; ++k )
attributeInfo[k] = 2;
Mesh->UnlockAttributeBuffer();
(2) 渲染各个子集
for( int i = 0; i < Mesh->GetNumFaces(); ++i )
{
Device->SetTexture(...);
Device->SetMaterial(...);
Mesh->DrawSubSet( i );
}