본문 바로가기

프로그래밍

(36)
Landscape Heightmap의 데이터를 World Height로 바꾸어보자 아마 언리얼을 사용하는 대부분의 사용자에게는 전혀 필요없는 정보일 것이다. 사건의 발단은 언리얼 월드 전체를 Z축 방향으로 일정 Offset 만큼 올려야하는 일이 있어서였다. 월드 안에 있는 오브젝트가 한 두개 였다면 에디터에서 진행했겠지만, 수십만개의 오브젝트가 있었기 때문에 그건 불가능했다. Actor의 경우 정한 Offset 만큼 Z축 방향으로 올려준 뒤, SetActorLocation을 불러주고 저장하면 된다. 그러나 이렇게 해버리면 Landscape는 올라가지 않는다. Landscape를 위해서는 Heightmap 데이터를 불러와서, World의 Offset만큼 높여준 뒤 다시 Heightmap의 형태로 저장해주어야 한다. Get landscape heightmap data Heightmap 데..
[UE5] Sparse Distance Field - 2. Distance Field의 스트리밍 이전 글에서 대상 메시의 정보를 이용하여 디스턴스 필드 정보를 생성하고, 이를 FDistanceFieldVolumeData에 저장하는 과정을 살펴보았다. 이 VolumeData는 UStaticMesh의 RenderData 내부의 LODResource[0]번째에 DistanceFieldData라는 이름으로 저장되어있다. 또한 이 데이터를 어떤 형태로 저장해 두었는지 또한 확인하였다. 이번 글에는 이 에셋 데이터가 어떻게 씬에 올라가게 되고, 스트리밍 되는지를 살펴볼 예정이다. FDistanceFieldSceneData 지난 번에 살펴본 FDistanceFieldVolumeData가 각 메시 에셋을 대표한다면, FDistanceFieldSceneData는 이 에셋들을 관리하고 적절히 업데이트 해주는 책임을 ..
[UE5] Sparse Distance Field - 1. Distance Field를 만드는 과정 언리얼 엔진이 5 버전으로 넘어오면서, 디스턴스 필드 또한 눈에 띄진 않지만 많은 부분을 개선했다. 기존 4 버전에서는 메시의 디스턴스 필드를 사용하는데 있어서 가장 큰 문제는 너무 많은 메모리를 소비한다는 점이었다. 그렇기 때문에 디스턴스 필드는 해상도가 굉장히 제한적이었고, 많은 부분에 사용하기도 어려웠다. 5 버전에서는 이것을 개선하기 위해 디스턴스 필드에도 텍스쳐와 같이 Mip Level을 나누고, 이를 스트리밍할 수 있도록 만들었다. 스트리밍이 가능해졌기 때문에 상대적으로 가까운 물체에는 높은 해상도의 디스턴스 필드를, 그렇지 않은 물체에는 낮은 메모리 점유라는 이득을 취할 수 있었다. 물론 스트리밍에 드는 비용을 트레이드 오프로 지불해야만 한다. FMeshUtilities::GenerateSi..
자체 게임 엔진 개발하기 (HopStep Engine) - HeaderTool 만들기와 Property Get/Set 메서드 작성 요즘 너무 게임만 하는 것 같아서, POE를 좀 정리하고 자체엔진 만드는 취미를 다시 조금씩 하고 있다. 지난 번에 끝났던 상태는 리플렉션 구현인데, 그 상태에서 계속 이어서 진행해보았다. HeaderTool Unreal Header Tool의 역할을 해줄 프로젝트를 하나 만들었다. 언리얼은 BulidTool이 C#이고, HeaderTool은 C++로 구현되어있는데, 내 프로젝트에서는 그냥 편의를 위해 C#으로 구현했다. 당장에는 필요한 기능이 많지 않으므로, 유연해보이지 않더라도 최대한 가볍게 구현해보는 것이 목적이다. 내 HeaderTool의 목적은 결국 엔진, 컨텐츠단의 오브젝트들의 정보를 읽고, 이를 지원하는 리플렉션 정보를 생성하는 것이다. 위와 같은 헤더를 읽고, Finite State Mac..
[UE4] Virtual Texturing과 Clipmap Virtual Texturing(VT)이란 오픈 월드 게임등의 대규모 텍스쳐 사용에 따른 메모리 문제를 해결하기 위해, OS의 Virtual memory 알고리즘을 텍스쳐 시스템에 적용한 것이다. 메모리란 언제나 한정된 자원이고 이를 최대한 활용하기 위한 기법은 언제나 수요가 있다. VT는 텍스쳐를 일정한 크기의 Page(Tile)로 구분하여, 해당 페이지가 필요한 수준의 Mip Level을 타일 별로 메모리에 올리도록 만들어준다. 이는 기존에 언리얼에서 사용하던 텍스쳐 스트리밍 기법에 비해 페이지 관리 및 탐색 비용을 더 필요로하지만 메모리 사용량을 줄일 수 있다는 이점이 있다. Clipmap Clipmap은 VT 이전 시대의 텍스쳐 메모리 최적화 솔루션이다. 아래 레퍼런스 링크에서 설명을 굉장히 잘해..
자체 게임 엔진 개발하기 (HopStep Engine) - Reflection과 Property / 해야할 일 정리 (2) Metadata 언리얼에는 메타데이터라는 이름을 사용하는 여러가지 메서드들이 있다. 이는 언리얼 리플렉션 구조에서는 Field라는 클래스가 담당하고 있다. 그래서 이 녀석은 뭐지...? 하고 좀 살펴보니 UPROPERTY 한정자들을 저장해주는 것 같다. 정말 에디터에서 사용할 메타데이터라는 느낌? 당분간은 이 메타데이터에 신경쓰지 말자. 해야할 일 정리하기 게임을 하다왔더니 내가 뭘 하려고 했었는지 잘 생각이 나질 않아서 뭘 할지 좀 정리하기로 했다. 나는 뭘 하고 싶은걸까? 우선 선언되어있는 GameObject의 프로퍼티들을 알 수 있게 했으면 좋겠다. 더 구체적으로 말하면 GameObject의 Ctrl + C, V를 구현하면 어떨까? 언리얼에서는 액터를 선택한 채로 Ctrl + C를 누르면 이 액터의..
[Unreal] 클래스의 Prefix를 F로 사용하는 이유. Unreal trivia: What does the 'F' prefix on classes and structs stand for? - Programming & Scripting / C++ - Unreal Engine Forums Unreal trivia: What does the 'F' prefix on classes and structs stand for? This gets asked all the time and I thought I would share the official story, as I remember wondering the same thing. ‘U’ stands for UObject, ‘A’ stands for actor, ‘T’ stands for Template. Everyon..
자체 게임 엔진 개발하기 (HopStep Engine) - Reflection과 Property 자체 엔진 만들기를 시작하면서 가장 먼저 목표로 삼았던 것은 리플렉션 시스템의 구현이다. 리플렉션이라는 개념은 C#을 사용하면서 어느 정도는 알고 있다고 생각했지만, 직접 구현을 하는 것은 그보다 더 깊은 이해도를 줄 것이라고 생각했다. 또 이 리플렉션 시스템이야 말로 UE4의 코어 시스템 중 하나라고 생각하기도 했고. 리플렉션(Reflection)이라는 것은 거울에 비친 자기 자신을 보듯이, 시스템의 어떤 타입이 자기 자신이 어떻게 생겼는지를 알 수 있는 시스템이라고 설명할 수 있을 것 같다. 어떤 타입이 어떤 프로퍼티와 어떤 메서드를 가지고 있는지를 확인하고, 한 발 더 나아가서 동적으로 이를 런타임에 수정할 수 있는 시스템 구축이 나의 목표이다. C#에서는 어떤 타입의 리플렉션 정보는 해당 타입이 ..