|
|
发表于 2008-3-15 10:35:00
|
显示全部楼层
Re: 求助关于每次渲染能设置的骨骼数目的问题。
D3D如果是使用ID3DXMesh, ID3DXSkinInfo来生成带骨骼动画的模型的, 有两种方式:
1. 是使用ConvertToBlendedMesh生成的, 这种收到硬件的限制, D3DCAPS9.MaxVertexBlendMatrices的数量, 现在的显卡一般是4, 所以只能设置4个混合用的矩阵.
2. 使用ConvertToIndexedBlendedMesh生成的, 在生成的mesh顶点数据中有一个8位的矩阵数组索引, 被称为palette模式.固定管线可以支持最多到255个.不过固定管线的速度相当的慢, 所以现在几乎没人直接用这个方式. 这个方式的模型可以使用VS来设置矩阵数组, 用顶点数据中的数组来索引.
使用第一种方式生成的模型, 受限于单次设置骨骼数目, 所有会有很多的AttributeGroup, D3DXMesh中每个attributegroup都会调用DrawMeshSubset, 其实最终的调用还是DrawPrimitive, 所以效率很相当的地下.并且为了减少attributegroup的个数, 生成mesh的时候SDK会尝试做优化, 即使美术在max中是做的2link的模型, 也有可能会被改成4link的, 以节约DrawPrimitive的调用次数.但是这个优化的转换不一定对所有模型都成功.
使用第二种方式的模型, 如果使用VS来绘制, 那么单次设置的matrix个数就由可以使用的VS固定寄存器(Shader Constant)个数决定. 一般来说VS2.0的显卡支持256个float4的shader constant, 除去VS运行本身需要的(如果VS不是太复杂的话), 一般可以支持到70个左右的4x4矩阵, 也就是说可以一次画70个骨骼控制范围内的模型, 如果超过了70个, 就需要两次或者更多.相对于第一种方式, 效率高了很多. |
|