DX9관련 질문입니다.

각 게시판의 주제에서 벗어나는 게시물을 삭제 전에 임시로 보관하는 곳입니다. 읽기 전용이나, 자신의 글을 삭제, 수정하는 것은 가능합니다.
Post Reply
goodmirow
Posts: 4
Joined: 2013-04-16 03:01
Location: 한국산업기술대학교 게임공학과

DX9관련 질문입니다.

Post by goodmirow »

DX9게시판이 없어서 부득이하게 이와같은 게시판에 글을올리게 되었습니다.
제가 요즘 하고 있는 작업이 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;
}

위와같은 코드인데 다른부분은 다 데이터도 잘넘어오고 하는데 이상하게 BoneIndices를 통해
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() };	
다음은 정점 버퍼 구조체와 FVF형식입니다

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
이와 같은 코드로 Rendering을 하고 있는데 도저히 왜 BoneIndices가 제대로 안돼는건지
제 생각엔 BoneIndicdes가 UBYTE4(4byte)짜리로 선언이 되어있는데
Shader에선 int4(4byte*4)로 선언이 되어있어서 그런것 같은데 그래서 float4로 바꿔보았는데도
똑같이 안돼어서 이렇게 글을 올려봅니다.
원하는 것은 반드시 얻는다.
Post Reply