游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6661|回复: 13

使用vertex shader计算骨骼动画时的奇怪问题

[复制链接]

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2007-3-17 12:10:00 | 显示全部楼层 |阅读模式
顶点定义如下:
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]

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-3-17 21:29:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

不清楚是不是??樱?梢?⒖枷拢?300GT不懂什么卡,可能不支持VS_2_0,用SW??的?r候VS用的是?件模?M,你的卡最好是在caps里查下。

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
 楼主| 发表于 2007-3-17 22:33:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

可以肯定显示卡支持vs 2.0并且在caps里是D3DCREATE_HARDWARE_VERTEXPROCESSING

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-3-18 15:19:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

SW??一般可以充分支持VS,因?橹荒苡密?件模?M。但是支持HW??的卡可不一定支持硬件VS的。

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-3-18 15:20:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

查caps是查VS版本不是查HWVP哦

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
 楼主| 发表于 2007-3-18 23:15:00 | 显示全部楼层

Re: 使用vertex shader计算骨骼动画时的奇怪问题

这里有vc调试的截图
sf_200731823155.jpg

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-3-18 23:54:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

3.0的VS和PS,?拇?a里我也看不出?恚?荒?湍?p

代?里和你?的情形?o?的???:constant的bonematrix查找表?槭裁从米??担

0

主题

54

帖子

54

积分

注册会员

Rank: 2

积分
54
发表于 2007-3-19 09:09:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

你传到skinnedPosition里的数据可能有问题。没看到你代码具体就不知道了。你保存的每个顶点和影响他骨骼的索引和其对应的矩阵数据有没有问题?

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
 楼主| 发表于 2007-3-19 10:15:00 | 显示全部楼层

Re: 使用vertex shader计算骨骼动画时的奇怪问题

首先感谢各位朋友的帮助。

我使用的模型数据是自己编写的3dmax导出插件,使用IGameScene导出的数据。使用IGAME_D3D坐标系。

bonematrix里面的数据是骨骼矩阵 * 骨骼动画矩阵。关键问题是我使用CPU运算方式可以,或则使用soft vertex shader也可以。并且用了一个只有54个顶点的模型,每个顶点的结果都查看了,没有找到一个错误的运算。

        stVertex *        vertexbuffer;
        stVertex *        originalityvertexbuffer = ( stVertex * )m_pVertex;

        GetD3DVertexBuffer()->Lock( 0, 0, ( void ** )&vertexbuffer, 0 );

        for( ulong vertexindex = 0; vertexindex < GetVertexCount(); ++ vertexindex )
        {
                D3DXVECTOR3 vertex[ 4 ];
                D3DXVECTOR3 normal[ 4 ];

                D3DXVec3TransformCoord( &vertex[ 0 ], &originalityvertexbuffer[ vertexindex ].Vertex, &( bonematrix[ originalityvertexbuffer[ vertexindex ].Bone.Index[ 0 ] ] ) );
                D3DXVec3TransformCoord( &vertex[ 1 ], &originalityvertexbuffer[ vertexindex ].Vertex, &( bonematrix[ originalityvertexbuffer[ vertexindex ].Bone.Index[ 1 ] ] ) );
                D3DXVec3TransformCoord( &vertex[ 2 ], &originalityvertexbuffer[ vertexindex ].Vertex, &( bonematrix[ originalityvertexbuffer[ vertexindex ].Bone.Index[ 2 ] ] ) );
                D3DXVec3TransformCoord( &vertex[ 3 ], &originalityvertexbuffer[ vertexindex ].Vertex, &( bonematrix[ originalityvertexbuffer[ vertexindex ].Bone.Index[ 3 ] ] ) );

                vertex[ 0 ] *= originalityvertexbuffer[ vertexindex ].Weight.Weight[ 0 ];
                vertex[ 1 ] *= originalityvertexbuffer[ vertexindex ].Weight.Weight[ 1 ];
                vertex[ 2 ] *= originalityvertexbuffer[ vertexindex ].Weight.Weight[ 2 ];
                vertex[ 3 ] *= originalityvertexbuffer[ vertexindex ].Weight.Weight[ 3 ];
                vertexbuffer[ vertexindex ].Vertex        = vertex[ 0 ] + vertex[ 1 ] + vertex[ 2 ] + vertex[ 3 ];

                vertexbuffer[ vertexindex ].Normal        = D3DXVECTOR3( 0, 0, 0 );
                vertexbuffer[ vertexindex ].Texture        = originalityvertexbuffer[ vertexindex ].Texture;
        }

        GetD3DVertexBuffer()->Unlock();

6

主题

40

帖子

58

积分

注册会员

Rank: 2

积分
58
 楼主| 发表于 2007-3-19 10:18:00 | 显示全部楼层

Re:使用vertex shader计算骨骼动画时的奇怪问题

补充一点,上面的代码是cpu计算的,显示上没有错误,完全正确。
bonematrix里面的数据是骨骼矩阵 * 骨骼动画矩阵。骨骼动画矩阵是包含层级关系的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 19:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表