看Ogre的基本图元DX渲染时,看到它在创建VertexBuffer时,并没有用到我想像中的FVF(Flexible Vertex Format),询问了一下才知道人家用的是MultiStream。看来基础知识还是不扎实。

 

搜了一些资料,在这共享一下。

 

首先:

在D3D中,要渲染的顶点数据是放在Vertex Buffer中的,一般的做法是把顶点坐标、颜色等按照自定义的顶点格式放在同一个Vertex Buffer中,代表一个流,然后通过FVF来告诉D3D要渲染的顶点的格式。但是在某些情况下,放在一起并不是最佳选择。比如在动画中,每一帧的顶点坐标都在变化,但是纹理坐标却都不变(md3格式就是如此)。如果只用一个流,每画一帧就得把所有数据都拷贝到一个临时Vertex Buffer中再渲染,开销巨大。如果能把不同的数据放在不同的流中,就可以只更新顶点坐标的流,而纹理坐标的流就可以保持不变了。而且,只用一个Vertex Buffer时要管理FVF和数据结构体之间的关系,万一弄错了,是很难发现的。

 

几乎所有的DX入门书都在介绍灵活顶点格式(FVF),对MultiStream却鲜有提及。事实上,MultiStream是一个图形库必不可少的部分,它不但提供了更高的灵活度,同时也提供了一定的性能优化。简单的说,MultiStream是用多个VertexBuffer代替单个针对只使用0号Stream的一个改进。GPU精粹2中将顶点数据分为几何(坐标,法线,漫反射颜色,镜面反射颜色)、纹理(N个纹理坐标+附加信息)、动画(骨骼权重)、用户自定义常量,这四类顶点数据各自使用一个流。在声明顶点格式的时候,用D3DVERTEXELEMENT9代替原来的FVF宏,创建一个IDirect3DVertexDeclaration9,渲染时用SetVertexDeclaration代替原来的SetFVF。

 

 

链接:

D3D中多流的用法

http://dev.gameres.com/Program/Visual/3D/multistream.htm

SetStreamSource函数与数据流的使用

http://www.zxbc.cn/html/20071116/29530.html