网格模型基础二

来源:互联网 发布:三八线网络更新时间 编辑:程序博客网 时间:2024/05/22 03:47

作者:StrongCoding

邮箱:StrongCoding@qq.comDX群: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 );

}