제가 요즘 하고 있는 작업이 Skinning Animation을 HLSL Shader를 통해 Rendering하는 작업입니다.
그런데 한가지 오류가 생겼습니다.
제 셰이더 코드는 다음과 같습니다
Code: Select all
VS_OUTPUT VS_Main(
float3 PosL : POSITION0,
float3 Weights : BLENDWEIGHT,
int4 BoneIndices : BLENDINDICES,
float3 NormalL : NORMAL,
float2 Tex : TEXCOORD0
)
{
VS_OUTPUT VtxOut = (VS_OUTPUT)0;
float weights[4] = { -1.0f, 0.0f, 0.0f, 0.0f };
weights[0] = Weights.x;
weights[1] = Weights.y;
weights[2] = Weights.z;
weights[3] = 1.0f - weights[0] - weights[1] - weights[2];
float3 posL = float3(0, 0, 0);
float3 normalL = float3(0, 0, 0);
if (weights[0] >= 0)
{
for (int i = 0; i < 4; ++i)
{
float4x4 mat = g_mBoneTM[BoneIndices[i]];
posL += weights[i] * mul(float4 (PosL, 1.0f), mat).xyz;
// normalL += weights[i] * mul(float4 (NormalL, 1.0f), (float3x3)g_mBoneTM[BoneIndices[i]]).xyz;
}
VtxOut.PosW = mul(float4(posL, 1.0f), g_mWVP);
VtxOut.PosH = mul(float4(posL, 1.0f), g_mWVP);
VtxOut.NormalW = mul(NormalL, (float3x3)g_mWVP);
}
////VtxOut.Tex = mul(float4(vtxdata.Tex, 0.0f, 1.0f), g_mWVP).xy;
VtxOut.Tex = Tex;
return VtxOut;
}
g_mBoneTM에 접근을 하려고 하면 VS가 생성이 안됩니다.(g_mBoneTM[상수값]으로 설정시 잘됨)
다음은 Application에서 Decl Type설정 코드입니다.
Code: Select all
D3DVERTEXELEMENT9 decl[] = {
{ 0, 0, D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_POSITION,0,},
{ 0,12,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_BLENDWEIGHT,0},
{ 0,24,D3DDECLTYPE_UBYTE4,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_BLENDINDICES, 0},
{ 0,28,D3DDECLTYPE_FLOAT3,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_NORMAL,0 },
{ 0,40,D3DDECLTYPE_FLOAT2,D3DDECLMETHOD_DEFAULT,D3DDECLUSAGE_TEXCOORD,0},
D3DDECL_END() };
Code: Select all
struct VTX_FORM
{
D3DXVECTOR3 vPos;
D3DXVECTOR3 vWeights;
BYTE mBoneIndices[4];
D3DXVECTOR3 vNormal;
D3DXVECTOR2 vTex;
}
#define FVF_VTX D3DFVF_XYZB4 | D3DFVF_LASTBETA_UBYTE4 | D3DFVF_NORMAL | 3DFVF_TEX1
제 생각엔 BoneIndicdes가 UBYTE4(4byte)짜리로 선언이 되어있는데
Shader에선 int4(4byte*4)로 선언이 되어있어서 그런것 같은데 그래서 float4로 바꿔보았는데도
똑같이 안돼어서 이렇게 글을 올려봅니다.