티스토리 뷰

최근 일주일 조금 넘도록 런타임에서 스태틱 메시를 생성하는 방법을 알기 위해서 엔진을 뒤적거렸었습니다. 결과적으로는 시간과 도메인 지식의 부족으로 인해서 후일로 기약하게 되었습니다만, 그동안 알게된 것을 조금 적어보고자 합니다.

이번 포스팅에서는 그 중 런타임 중에 스태틱 메시가 가지고 있는 정점 배열에서 정점을 읽어오는 것을 설명하고자 합니다.

 

 

 

RenderData


스태틱 메시, UStaticMesh 클래스는 런타임뿐만 아니라 에디터 모듈 및 개발자(Developer) 모듈과도 얽혀있는 복잡한 클래스입니다. UStaticMesh 클래스에는 다양한 멤버 변수들과 함수들이 정의되어 있지만, 대부분이 에디터와 관련되어 있어 패키지된 빌드에서 UStaticMesh 클래스에서 가지는 변수, 함수들은 많지 않습니다.

그 중 핵심은, RenderData 변수입니다. RenderData는 UStaticMesh 클래스에더 다음과 같이 정의되어 있습니다.

    /** Pointer to the data used to render this static mesh. */
    TUniquePtr<class FStaticMeshRenderData> RenderData;

 

RenderData에는 스태틱 메시에 대한 많은 데이터들을 가지고 있습니다. 정점, UV, 버텍스 컬러 등이 있으며, 이 중 정점 정보에 접근하기 위해서는 다음 코드를 사용하면 됩니다

    YourStaticMesh->RenderData->LODResources[LODIndex].VertexBuffers.PositionVertexBuffer.VertexPosition(Index)

 

여기서 YourStaitcMesh는 UStaticMesh의 인스턴스, Index는 해당 정점 버퍼의 정점에 접근하기 위한 인덱스라고 보시면 됩니다. 만약 특정 스태틱 메시의 모든 정점 정보를 출력하고 싶다면 다음과 같이 할 수 있습니다:

    for (int32 LODIndex = 0; LODIndex < InStaticMesh->RenderData->LODResources.Num(); ++LODIndex)
    {
        for (uint32 Index = 0; Index < InStaticMesh->RenderData->LODResources[LODIndex].
                VertexBuffers.PositionVertexBuffer.GetNumVertices(); ++Index)
        {
            FVector EachVector = InStaticMesh->RenderData->LODResources[LODIndex].
                    VertexBuffers.PositionVertexBuffer.VertexPosition(Index);
            UE_LOG(LogClass, Log, TEXT("Index(%d) : (%s)"), Index, *EachVector.ToString());
        }
    }

 

 

 

결과


출력 로그에 출력된 정점의 위치

 

 

 

레퍼런스


댓글