Graphics Programming

Skeletal Animation 본문

Season 1/OpenGL

Skeletal Animation

minseoklee 2017. 5. 23. 22:52


스켈레탈 애니메이션은 대충 본 계층도에 버텍스 스키닝을 한다는 정도로만 알고 있었는데, Frank D. Luna의 <Introduction to 3D Game Programming with DirectX 11>에서 개념과 구현 방법을 확실히 숙지하고, 코딩을 시작한 것이 아니라... 몇 주를 밍기적거리다 저번 주말에 구현했다.


일단 지금까지는 Wavefront OBJ 모델만 썼는데 OBJ 포맷은 뼈대도 애니메이션도 지원하지 않기 때문에 블렌더로 뼈대 애니메이션을 급조하고 DAE 포맷으로 익스포트했다. 예전에 모델 로더를 처음 만들 때만 해도 DAE 로더를 작성하려 했지만 무슨 이유에선가 OBJ 로더만 만들고 말았는데, 이번 기회에 Assimp 라이브러리를 이용해서 DAE 로더를 작성했다.



구현은 ogldev 튜토리얼을 참고했는데 내 경우는 기존 엔진에 버텍스 스키닝을 통합하려니 셰이더를 전부 손봐야했다. 일단 결과물이 보고 싶어서 버텍스 스키닝을 그냥 CPU에서 수행했다.


애니메이션 코드는 코딩하기 귀찮아서 Assimp 타입들을 그대로 썼는데, 엔진에서 자체적인 타입을 선언해서 데이터만 옮겨야 한다. 이건 기계적인 리팩토링으로 해결 가능하다.


버텍스 셰이더에 스키닝을 넣으려면 자질구레한 작업이 필요하다.


1. 지금의 Mesh 클래스는 본이나 애니메이션을 고려하지 않은 정적 메시를 표현한다. 일단 상속해서 SkinnedMesh를 만들어놨다.

2. 기존 셰이더들과 비슷한데 SkinnedMesh를 위해 버텍스 스키닝만 추가한 셰이더들을 하나씩 새로 만들어야 한다.

3. 뼈대가 너무 많으면 버텍스 셰이더 유니폼으로 한번에 넣을 수가 없어 메시를 쪼개야 한다.


이 작업은 언제쯤 할지 모르겠다. 처음엔 엔진을 엄청 열심히 만들었는데 오래되니까 흥미도 떨어지고, "머리로는 다 아는데 구현하기 귀찮은" 병이 도졌다. (사실 구현하기 전에는 제대로 아는 지도 모름)

Comments