눈팅하는 게임개발자 블로그
OpenGL Model Loading 4-1 Assimp 본문
원문 사이트
learnopengl.com/Model-Loading/Assimp
번역 사이트
heinleinsgame.tistory.com/21?category=757483
Assimp
지금까지의 모든 scene들에서 컨테이너 박스들을 많은 방법으로, 광범위하게 가지고 활용했었다.
하지만 이제는 슬슬 이 박스들이 지루해지기 시작한다.
실제 그래픽 응용 프로그램에서는 일반적으로 많은 복잡하고 흥미로운 모델들이 존재한다.
이 모델들은 정적인 컨테이너보다 보기 좋을 것이다.
하지만 컨테이너 오브젝트와 다르게 집, 차량, 사람과 같은 복잡한 도형의 모든 vertex, 법선, 텍스처 좌표를 일일히
정의할 수는 없다.
대신 우리가 할 일은 이 모델들을 응용 프로그램에 import 하는 것이다.
이 모델들은 3D 아티스트가 Blender, 3DS Max, Maya 같은 툴을 사용하여 디자인한 것들이다.
3D modeling tools 라고도 불리는 이 도구들은 아티스트가 복잡한 도형을 만들 수 있도록 도와주고 여기에
uv-mapping이라고 불리는 처리르 통해 텍스처를 적용시킨다.
이 툴들은 model 파일 포맷으로 추출하면 모든 vertex 좌표들과 법선, 텍스처 좌표들을 자동으로 생성한다.
이런식으로 아티스트들은 많은 기술적인 부분들을 신경쓰지 않고 높은 퀄리티의 모델을 만들 수 있는 다양한 툴들을
가지고 있다.
추출된 모델 파일에는 모든 기술적인 관점들이 숨겨져 있다.
그래픽 프로그래머로서 이러한 기술적인 상세 부분들을 신경써야 한다.
따라서 이러한 추출된 모델 파일들을 분석하여 모든 관련된 정보들을 추출하는 것이 우리의 일이다.
그래서 우리는 이 정보들을 OpenGL이 이해할 수 있는 형식으로 저장해야 한다.
하지만 모델 데이터를 추출할 때 가질 수 있는 파일 포맷은 아주 많이 존재한다.
Wavefront.obj와 같은 모델 포맷들은 코델 컬러, diffuse/specular map들과 같은 작은 material 정보들과 함께
모델 데이터를 가지고 있다.
반면에 XML 기반의 Collada 파일 포맷과 같은 모델 포맷들은 모델, light, 다양한 종류의 material들, 애니메이션 데이터,
카메라, 완전한 scene 정보 등을 아주 광범위하게 가지고 있다.
Wavefront 오브젝트 포맷은 일반적으로 분석하기 쉬운 모델 포맷으로 여겨진다.
Wavefront wiki 페이지에 최소한 한 번 방문하여 이 파일 포맷의 구조를 확인하는 것을 권장한다.
모델 파일 포맷들이 일반적으로 어떤 구조를 가지고 있는지에 대해 기본적인 개념을 이해할 수 있을 것이다.
일반적이지 않은 파일 포맷도 많이 존재한다. 그래서 이러한 포맷의 모델을 추가하려면
직접 해당 포맷들을 읽어들이기 위한 importer를 작성해야 한다.
운 좋게도 이 일을 해주는 라이브러리가 존재한다.
Model Loading Library
가장 많이 쓰이는 모델 importing 라이브러리는 Assimp라고 불리며 Open Asset Import Library를 의미한다.
Assimp는 모든 모델의 데이터들을 Assimp가 생성한 데이터 구조로 불러옴으로써 많은 종류의 모델 파일 포맷을
import(그리고 export 또한 가능)할 수 있다. Assimp가 모델을 로드하기만 하면 Assimp의 데이터 구조에서
원하는 모든 데이터를 얻을 수 있다.
Assimp의 데이터 구조가 import된 파일 포맷의 유형과 관계없이 동일하게 유지되기 때문에 모든 다른 파일 포맷들을
추상화해준다.
Assimp를 통해 모델을 import 할 때, 전체적인 모델을 import된 모든 모델/scene을 포함하고 있는 scene 객체에 불러온다.
그 다음 Assimp는 노드의 모음을 가지게 되는데 각 노드는 자신의 자식 노드들을 인덱싱할 index들을 가지고 있다.
Assimp의 구조 모델은 다음과 같다.
Scene/model의 모든 데이터는 모든 material, mesh들과 마찬가지로 Scene 객체에 포함된다.
또한 이는 scene의 루트 노드에 대한 참조를 가지고 있다.
Scene의 루트 노드는 자식 노드들을 포함(다른 모든 노드들과 마찬가지로)할 수 있고 scene 객체의 mMeshes 배열 안의
데이터를 가리키는 인덱스들의 모음을 가지고 있다. 이 루트 노드의 mMeshes 배열은 실제 Mesh 객체들을 가지고 있고
일반 노드의 mMeshes 배열에 들어있는 값은 오직 scene의 mesh 배열에 대한 index들만 가지고 있다.
Mesh 객체는 렌더링하는 데에 필요한 모든 관련 데이터들을 포함한다.
오브젝트의 Vertex 위치, 법선 벡터, 텍스처 좌표, 면, material과 같은 정보들이다.
Mesh는 여러개의 면들을 가진다. 면(Face)은 렌더링 기본 오브젝트(삼각형, 사각형, 점)를 나타낸다.
면은 primitive를 형성하기 위한 vertex들의 index를 가지고 있다.
vertex들과 index들이 분리되어 있기 때문에 index 버퍼를 통해 렌더링하는 것을 쉽게 만들어 준다.
마지막으로 mesh는 Material 객체도 가지고 있다. 이 객체는 오브젝트의 material 속성들을 얻기 위한
여러가지 함수들을 관리한다. 텍스처 map(diffuse, specular map)과 컬러를 생각하면 된다.
그래서 지금 먼저 해야할 일은 Scene 객체에 오브젝트를 불러오는 것이다.
각 노드들의 해당 Mesh 객체들을 재귀적(각 노드의 자식들을 재귀적으로 검색)으로 얻고
vertex 데이터와 index, material 속성들을 얻기 위해 각 Mesh 객체를 처리한다.
그러면 그 결과는 하나의 Model 객체에 포함시킬 mesh 데이터의 모음이 된다.
다음 강좌에서 Model과 Mesh 클래스들을 생성할 텐데, 이 클래스들은
import된 모델들을 위의 구조를 사용하여 불러오고 저장한다.
그 다음 모델을 그릴 때 이 모델 전체를 렌더링하지 않고 이 모델을 이루고 있는
각각의 모든 mesh들을 렌더링한다.
하지만 모델들을 import하기 전에 먼저 프로젝트에 Assimp를 추가해야 한다.
'공부한거 > OpenGL' 카테고리의 다른 글
OpenGL Model Loading 4-3 Model (0) | 2020.12.07 |
---|---|
OpenGL Model Loading 4-2 Mesh (0) | 2020.12.07 |
OpenGL Lighting 3-6 Multiple Lights (0) | 2020.12.06 |
OpenGL Advanced 5-6 Cubemaps (0) | 2020.11.26 |
OpenGL Lighting 3-5 Light casters (0) | 2020.11.04 |