看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函数与数据流的使用