스크닝 애니메이션 개념 정리
Shader 에 추가된 코드 부분
matrix SkinWorld(float4 indices, float4 weights) // 상위 Shader 파일
{
matrix transform = 0; //영행렬
transform += mul(weights.x, Bones[(uint) indices.x]);
transform += mul(weights.y, Bones[(uint) indices.y]);
transform += mul(weights.z, Bones[(uint) indices.z]);
transform += mul(weights.w, Bones[(uint) indices.w]);
return transform;
}
// 기타생략
PixelInput VS(VertexInput input) // 하위 Shader 파일
{
PixelInput output;
output.Uv = input.Uv;
// ↓스키닝 관련 코드 구간↓
Matrix world;
[flatten]
if (input.Weights.x)
world = SkinWorld(input.Indices, input.Weights);
else
world = World;
// ↑스키닝 관련 코드 구간↑
output.Position = mul(input.Position, world);
output.wPosition = output.Position.xyz;
output.Position = mul(output.Position, ViewProj);
output.Normal = mul(input.Normal, (float3x3) world);
output.Tangent = mul(input.Tangent, (float3x3) world);
output.Binormal = cross(output.Normal.xyz, output.Tangent.xyz);
return output;
}
스키닝이 적용되어 관절의 각도를 변경하여도 Mesh가 끊어지지 않게 되었다!
'공부 > Animation' 카테고리의 다른 글
[Animation] Animation 클래스 정리 (0) | 2023.07.04 |
---|---|
[Animation] 애니메이션 블렌드(Animation Blend) (0) | 2023.07.04 |
[Skeleton] Skeleton.h & Skeleton.cpp 정리 (0) | 2023.06.28 |
[Animation] 키프레임(KeyFrame) 애니메이션 (0) | 2023.06.28 |
[Animation] 스키닝(Skinning) 애니메이션 (0) | 2023.06.22 |
댓글