|
|
顶点定义如下:
struct stVertex
{
D3DXVECTOR3 Vertex;
D3DXVECTOR3 Normal;
D3DXVECTOR2 Texture;
D3DXVECTOR4 Weight;
unsigned char Indices[ 4 ];
D3DXVECTOR3 Binormal;
D3DXVECTOR3 Tangent;
};
顶点描述:
D3DVERTEXELEMENT9 vDeclaration[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
{ 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
{ 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
{ 0, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 },
{ 0, 48, D3DDECLTYPE_UBYTE4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 },
{ 0, 52, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0 },
{ 0, 64, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0 },
D3DDECL_END(),
};
Vertex Shader:
float4x4mViewProjection;
float4x4mBoneMatrix[ 128 ]: WORLDMATRIXARRAY;;
struct VsInput
{
float4Vertex: POSITION;
float4 Weights: BLENDWEIGHT;
float4Indices: BLENDINDICES;
float3Normal: NORMAL;
float2Tex0: TEXCOORD0;
};
struct VsOutput
{
float4Vertex: POSITION;
float4diffuse: COLOR;
float2Tex0: TEXCOORD0;
};
float4 skinnedPosition( const float4 inPos, const float4 weights, const float4 indices, const matrix<float,4,4> bonematrix[ 128 ] )
{
float4 pos[4];
pos[ 0 ] = ( mul( inPos, bonematrix[ indices[ 0 ] ] ) ) * weights[ 0 ];
pos[ 1 ] = ( mul( inPos, bonematrix[ indices[ 1 ] ] ) ) * weights[ 1 ];
pos[ 2 ] = ( mul( inPos, bonematrix[ indices[ 2 ] ] ) ) * weights[ 2 ];
pos[ 3 ] = ( mul( inPos, bonematrix[ indices[ 3 ] ] ) ) * weights[ 3 ];
return float4( pos[0] + pos[1] + pos[2] + pos[3] );
}
VsOutput vsSkinMain( const VsInput vsIn )
{
VsOutput vsOut;
vsOut.Vertex= mul( skinnedPosition( vsIn.Vertex, vsIn.Weights, vsIn.Indices, mBoneMatrix ), mViewProjection);
vsOut.Tex0= vsIn.Tex0;
vsOut.diffuse= float4( 0.5, 1, 1, 0.5 );
return vsOut;
}
technique
{
pass p0
{
VertexShader = compile vs_2_0 vsSkinMain();
}
}
显卡:7300GT
问题:
只有使用D3DCREATE_SOFTWARE_VERTEXPROCESSING创建的设备该shader才能正常计算出骨骼动画。一旦使用D3DCREATE_HARDWARE_VERTEXPROCESSING创建设备,该shader根本就不起作用,变成固定管道渲染(vsOut.diffuse= float4( 0.5, 1, 1, 0.5 );设置了偏色,但是渲染出来的图形是原始颜色的,判断出该shader没有起作用)。但是一旦将vsOut.Vertex= mul( skinnedPosition( vsIn.Vertex, vsIn.Weights, vsIn.Indices, mBoneMatrix ), mViewProjection);
改为vsOut.Vertex= mul( vsIn.Vertex, mViewProjection)则该shader工作正常,模型渲染出来有偏色。
补充:mesh没有使用ID3DXMesh,是使用VertexBuffer和IndexBuffer。Shader使用ID3DXEffect。
注:可以肯定顶点数据没有任何问题,CPU运算显示正常,D3DCREATE_SOFTWARE_VERTEXPROCESSING标志Shader运算正常。
请各位高人指教一下这个问题,谢谢。 [em7] [em7] [em7] [em7] |
|