🎨DirectX

[DX] Model Material Export (.material, TINYXML)

공대 컴린이 2023. 5. 3. 11:32
728x90

하얀색으로만 그렸던 Model의 렌더링에 색상이나 무늬를 입히기 위해 Model Material을 입히는 작업을 학습하였다.

 

이전에 Mesh를 가져올때 Material Name을 가져왔던 방식과 비슷하게, Scene에 존재하는 Material을 전부 파일로 저장한 뒤, 저장해놓은 Material 배열을 읽어들여서 이름을 비교한 후 렌더링하는 방식으로 구현하였다.

👀 Material 구조체

Material의 정보를 저장하기 위한 구조체로, Material의 색상값들과 각 Material File의 경로를 저장하기 위한 변수를 담아두었다.

📦 Material Export (.material)

Material을 읽기에 앞서 먼저 fbx 파일을 읽어 .material 파일로 Export 해보았다.

 

ExportMaterial 함수에서는 Overwrite의 여부를 bool형으로 받아 처리한다.

Overwrite를 하지 않는다면 해당 경로에 파일이 존재하는지를 검사한 뒤 return 시킨다.

 

ReadMaterialData 함수에서는 머티리얼의 Ambient, Diffuse, Specular, Shininess, Emissive 값에 대한 색상을 초기화한 뒤, Diffuse, Specular, Normal 파일들을 각각 초기화 해 주었다.

 

이후, 읽어들인 Material 데이터를 .material 파일로 Export하기위해 WriteMaterialData 함수를 작성해주었다.

 

💡 TINYXML 라이브러리

여기서는 TINYXML 라이브러리를 이용한 xml 코드를 작성하였는데, TINYXMLC++로 xml 코드를 작성할 수 있도록 만들어진 라이브러리로, 헤더파일로 제공되기 때문에 손쉽게 프로젝트에 추가하여 사용할 수 있다.

 

XML 문서의 루트 노드부터 자식노드, 속성, 텍스트 등을 읽고 쓸 수 있고, 또한 노드를 추가하거나 삭제하는 등의 속성을 변경하는 작업도 가능하다.

 

TINYXML은 구문 분석 속도가 빠르고, 메모리 사용량이 적을 뿐만 아니라, 유연성과 호환성이 높아 다양한 플랫폼에서 사용할 수 있다는 장점이 있다.

반면, 완전한 XML 표준을 지원하지 않기 때문에 대용량 XML 문서를 다루거나 매우 복잡한 작업을 수행해야 하는 경우에는 다른 XML 라이브러리를 사용하는 것이 좋다.


WriteMaterialData 함수에서는 이러한 xml 코드를 이용하여 Material의 Name, DiffuseFile, SpecularFile, NormalFile을 저장하고, Ambient, Diffuse, Specular, Emissive의 Material Color 값들을 저장하였다.

 

Xml에 "Materials"라는 이름의 루트 엘리먼트를 만들고,  "xmlns:xsi"와 "xmlns:xsd" 속성을 추가하여 XML 스키마 정의에 대한 정보를 포함시켰다.

 

Airplane.material

이러한 구조로 만들어진 비행기 Material의 xml 파일은 위와 같다.

 

작성된 ExportMaterial 함수를 실행시키면 지정한 경로(_Textures)에 .material 형식의 파일이 생긴것을 확인할 수 있었다.

728x90