🎮Unreal4/C++_Plugin

[UE4] Save Mesh-1 : 데이터 추출하기(FStaticMeshRenderData, VertexBuffer/IndexBuffer)

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

디테일 패널의 커스텀 기능으로 Static Mesh의 정점 정보를 저장하여 원하는 형태로 저장할 수 있는 Save Mesh 기능을 구현해보았다.

 

이전에 만들어두었던 Mesh 카테고리의 Paint 버튼 아래에 Save 버튼을 추가한 뒤, Save 버튼이 눌렸을때의 기능을 구현하는 OnClicked_Save 함수를 작성하였다.

1️⃣ 클릭한 모든 액터들 배열에 저장하기

Save 버튼을 눌렀을때 Ctrl 키를 누르며 선택한 모든 객체들에 대해 기능을 수행하기 위해 배열 TArray에 ACStaticMesh 객체들을 저장하였다.

2️⃣ Mesh의 정점 정보 추출하기

StaticMesh_Detail.cpp

선택된 Mesh들의 for문을 돌면서 객체들의 Mesh Component에 접근하였다.

 

이때 구현 단계의 중간중간 조건에 맞지 않는경우 FReply::Unhandled를 출력하는데, 이는 Save 함수에서는 더이상 처리할 기능이 없으니 UI체계에 따라 다음 Layer로 명령을 넘기라는 의미이다.

(handled는 명령 처리를 멈추는 거고, Unhandled는 Pass 시키는 것)

 

MeshComponent에 접근하였다면, 실제로 화면에 모델이 그려지는 것은 Static Mesh 값이기 때문에 GetStaticMesh 함수를 통해 접근하였다.

 

이때 FStaticMeshRenderData 라는 자료형으로 Static Mesh의 RenderData를 저장하였는데, 

RenderData는 Mesh창에서 보이는LOD 및 Mesh의 다양한 정보들을 담고 있다.

 

실제 Rendering 데이터는 이러한 RenderData에 존재하는 LOD에 들어가있다. 위 사진에서는 0번째 LOD 데이터가 한 개 들어가있는 것이다.

 

StaticMesh_Detail.cpp

나는 모든 객체의 0번째 LOD 데이터로만 RenderData를 처리하는 코드를 작성하였다.

FStaticMeshLODResources 자료형으로 RenderData의 0번째 LODResource를 저장하고,

이러한 LOD를 통해 VertexBuffer PositionVertexBuffer와, Normal과 UV정보가 들어있는 StaticMeshVertexBuffer, 색상정보가 들어있는 ColorVertexBuffer를 불러왔다.

또한 IndexBufferFRawStaticIndexBuffer 자료형으로 불러왔다.

 

지금은 VertexBuffer의 이해를 돕기위해 하나의 VertexBuffer에 Position, UV, Color 등의 정보를 모두 일괄저장하지만, 실제 실무에서는 각 정보별로 Buffer를 분할하여 사용하며, 언리얼도 분할하여 이루어져 있다.

 

PositionVertexBufferGetNumVertices 함수를 사용하면 위치의 정점 개수를 반환받는다.

보통 Position Buffer의 개수를 버퍼의 개수 기준으로 잡는다. (ex.Position이 100개면 나머지도 100개)

 

이렇게 구한 정점 정보들을 출력한 결과는 다음과 같다.

 

출력된 값들과 Static Mesh창의 값들이 동일하므로 잘 출력된것을 확인할 수 있었다.

3️⃣ Save 데이터인 구조체 정보 추가하기

Mesh의 정보들이 잘 추출되는것을 확인했으니 실제 Save 파일로 전달할 데이터들을 FStaticMesh_DetailData라는 구조체로 저장하였다. Mesh 정보들과 Mesh의 부피인 Extent값과, Radius를 추가로 저장해주었다.

 

TArray 배열에 구조체를 담아 datas 변수로 만들었다.

 

Mesh의 부피를 찾아 Extent 변수에 초기화하기 위해 Mesh Position의 Min, Max값을 이용하였다.

position X,Y,Z의 min값과 max값을 각각 구한뒤, 두 수를 빼어 부피를 구했다.

그밖에 Position, Normal, UV, Color, Indicies값을 모두 추가한 뒤, datas 변수에 추가하였다.

 

Normal 값을 저장할때는 FStaticMeshVertexBufferVertexTangentZ 함수를 이용하여 값을 추출하였다.

Indices 값은 for문을 돌리지 않고 Insert 함수로 배열을 한번에 추가하였다.

 

저장된 정보를 Save File로써 전송하는 방법은 다음 게시글에서 정리하였다.

728x90