페이지

2018년 2월 18일 일요일

DirectX 환경에서 3D 모델 랜더링을 위한 라이브러리

3D 모델 포맷으로 제일 많이 쓰이는 포맷은 FBX와 OBJ 포맷을 꼽을 수 있습니다.

이외에도 3ds, blend 등 정말 많은 포맷이 존재하지만

일반적으로 위에 언급한 FBX파일과 OBJ파일을 구하기 쉽습니다.

FBX 포맷과 OBJ 포맷은 각각 특징이 존재합니다만 여기에는 게시하지 않을 예정입니다.

사실 이 부분은 구글에 검색해보시면 정말 많은 자료를 자세히 접할 수 있습니다.

저같은 경우 OBJ 파일에는 애니메이션이 탑재되어 있지 않고, FBX 파일에는 애니메이션을 탑재시킬 수 있다 정도로 이해하고 있습니다.

FBX 포맷의 파일을 기준으로 이를 내 응용프로그램에서 사용하기 위해서는 2가지 방법이 있습니다.


  1. FBX SDK를 사용한다
  2. ASSIMP 라이브러리를 사용한다.
1번 FBX SDK는 관련 자료를 찾기가 매우 어렵습니다... 정확히는 Autodesk에서 제공하는
설명서(?)를 제외하고는 국내외에서 모두 자료를 찾기 힘든 단점이 있습니다.

또한 웹상에서 쉽게 구할수 있는 자료의 경우 응용프로그램을 실행하고 실시간으로 모델을 다루는 것이 아닌 (애니메이션 등) 별도의 익스포터 프로그램을 만들어 내 응용프로그램에서 필요한 정보들만 파싱하는 형태입니다.

예를 들어 내가 A라는 파일이 있고, 이 파일은 모델에 대한 버텍스데이터, UV데이터, 노말데이터, 그리고 30프레임의 애니메이션데이터를 가지고 있다고 가정합시다.

그렇다면 쉽게 접할 수 있는 FBX SDK 사용법에 대한 자료의 경우 나에게 필요한 정보들을 미리 파싱해서 내 응용프로그램에서 사용할 포맷으로 변환하는 방법을 제공합니다.

여기서 주목할 점은 애니메이션의 처리입니다.

애니메이션 데이터의 경우 각 노드의 매프레임 회전, 이동, 크기변화가 저장되어 있습니다.
(애니메이션 데이터의 구조에 대해서는 다른 포스터에서 더 자세히 설명하겠습니다.)

이를 처리하는 방법으로는 2가지 방법을 볼 수 있는데,

첫번째 방법으로는 이를 단순히 행렬의 형태로 가공하고, 응용프로그램에서 실시간으로 각 버택스에 곱해주는 방법이 있습니다.

두번째 방법으로는 변환행렬에 따른 각 버텍스에 대한 변화량도 미리 전부 계산해서 저장해두는 방법입니다.

첫번째 방법의 경우 셰이더 코드를 사용하는 것이 아닌 CPU상에서 이를 처리하기 때문에 응용프로그램에 걸리는 부하가 무척 심할 것입니다. 

두번째 방법의 경우는 최초에 익스포터 프로그램을 작성할 때 복잡하겠지만, 내 응용프로그램에서 데이터를 미리 계산된 데이터를 사용하기에 프로그램에 걸리는 부하가 훨씬 적을 것입니다.

이에 대한 자료는 웹 상에 FBX SDK 라고 검색하면 관련 자료를 찾을 수 있을 것입니다.

저는 이 방법을 사용하지 않았기에 자세한 정보는 제공할 수 없어 유감입니다.

자 이제 2번째 방법인 ASSIMP 라이브러리를 사용하는 방법입니다.

ASSIMP 라이브러리의 또 다른 이름은 Open Asset Import Library입니다. 

공식 사이트의 경우 http://assimp.sourceforge.net/ 로 접속하시면 됩니다.

이 라이브러리의 장점은 오픈소스라는 것입니다. github에 라이브러리가 전부 공개되어 있기에 간단히 다운받아 사용하면 됩니다.

두번째 장점은 Open Asset Import Library라는 이름의 걸맞게 정말 많은 포맷의 3D 데이터를 지원합니다.

앞서 언급한 OBJ와 FBX 포맷은 물론이고 dae, md2, 3ds 등등.. 30여가지의 3D 데이터 포맷의 임포터를 지원하고 있습니다.

저같은 경우는 3D 모델을 임포트하고, 애니메이션 처리를 할 때 ASSIMP 라이브러리를 사용하여 처리하고 있습니다.

다만 ASSIMP 라이브러리의 최대 단점이 있는데 웹 상에서 얻을 수 있는 모든 자료가 OpenGL 기반이라는 것입니다.

아시다시피 DirectX와 OpenGL의 경우 좌표계가 달라서 이를 그래도 적용하면 의도치 않은 결과가 도출되게 됩니다. (모델의 어그러지는 등...)

앞으로 DirectX 12의 환경에서 ASSIMP 라이브러리를 활용하여 3D 모델 데이터(대표적으로 FBX) 를 로드하고 애니메이션을 적용하는 방법에 대해 포스팅해보려고 합니다.

댓글 없음:

댓글 쓰기