
Project Hedra는 고등학생 때 시작해 3D 게임과 게임 엔진으로 발전한 저폴리곤 오픈월드 RPG다. 절차적으로 생성되는 세계와 퀘스트를 탐험하고, 직업을 골라 기술을 해금할 수 있다. 게임은 Linux와 Windows를 지원한다.
게임과 엔진의 기능
Project Hedra는 Steam에서 제공된다. 개발자는 약 15세 때 OpenGL의 작동 방식을 배우려고 프로젝트를 시작했으며, 몇 년 뒤 게임과 엔진으로 규모가 커졌다고 설명한다. 코드베이스는 약 10만 줄이다. 저장소의 스크린샷에서 게임 화면을 볼 수 있다.
게임에는 절차적으로 생성되는 세계와 퀘스트, 보스, 희귀도 체계가 있는 100개 이상의 아이템이 포함된다. 기술과 기술 트리에는 여러 기술이 있으며, 네 가지 직업마다 두 가지 전문화가 있다. 구조물은 절차적으로 배치되고 동적으로 생성된다. 낚시와 제작, 거래, NPC, 동료와 애완동물, 지도와 여러 차원도 지원한다. 소개에는 사운드트랙과 그 밖에 기억나지 않는 기능도 언급돼 있다.
엔진은 최신 OpenGL을 사용하는 렌더러와 스키닝 메시 렌더링, 일반 애니메이션 로드·재생, Collada(.dae) 파서, 정적 메시 렌더링을 지원한다. 화면 공간 반사와 화면 공간 앰비언트 오클루전, 블룸, FXAA와 MSAA, 모딩, 현지화, OpenAL 기반 사운드, Python 스크립팅, Steam 연동 기능도 갖췄다. 데이터 지향 객체를 불러오는 모듈 시스템과 드롭다운·버튼 등을 포함하는 UI 및 조작 시스템은 OpenGL로 직접 작성했다.
그 밖에 실행 중 셰이더를 다시 불러오는 동적 셰이더 시스템, 절두체 컬링과 오클루전 컬링, 런타임 레벨 오브 디테일(LOD)을 위한 메시 단순화, 스카이박스와 그림자, 3D 궤적 렌더링, OpenGL 오브젝트 인스턴싱 기반 파티클 시스템을 지원한다. Bullet Physics와 청크 기반 무한 월드, .ply 파싱, Marching Cubes를 이용한 동적 메시 생성도 포함된다. 스택에 할당하는 리스트를 지원하고 자동 런타임 할당과 가비지 컬렉션(GC)을 줄이기 위해 기본 C# 자료형과 할당자를 자체 구현했다. 소개글은 테스트 케이스가 1,000개 이상이며 게임 구성 요소를 모의하고 통합 테스트를 수행하는 프레임워크도 있다고 설명한다. 이미지와 에셋 압축, 엔티티 컴포넌트 시스템도 기능 목록에 포함된다.
세계 생성과 구현 방식
세계는 전부 절차적으로 생성되며, 월드 저장 파일은 없다. 저장되는 것은 플레이어의 소지품과 세계 시드뿐이고 나머지는 실행 중 생성된다. 세계는 복셀 기반이지만, 이산적인 복셀에서 연속적인 암시적 표면을 추출하기 위해 Marching Cubes 알고리즘을 적용한다. 프로젝트 이름 Hedra는 개발자가 처음 구현한 등가면 추출 알고리즘인 Marching Tetrahedra에 쓰인 사면체에서 따왔다.
게임은 .PLY와 .DAE 모델만 불러오며 두 형식 모두 평문이고 모델에는 텍스처가 없다. 개발자는 텍스트를 읽어 상호작용 가능한 이미지를 만드는 코드를 작성했다는 점을 흥미로운 부분으로 꼽는다.
소개글은 WorldRenderer.cs가 glMultiDrawElements를 사용해 물, 지형, 인스턴싱 렌더링을 각각 한 번씩, 총 세 번의 드로 콜로 세계 전체를 렌더링하도록 설계됐다고 설명한다. 실제 드로 콜 수는 데이터 버퍼를 어떻게 분할했는지에 따라 달라질 수 있다. Block.cs는 세계의 핵심 구성 요소이며, 절차적 메시 생성에 관한 글에서 관련 내용을 확인할 수 있다.
Fishing.py는 IronPython을 사용하는 모드 스크립트로, C# API와 직접 상호작용한다. NativeArray.cs는 자체 할당자를 사용하는 배열 자료형 구현이다. 같은 프로젝트에는 힙 기반 할당자와 stackalloc을 사용하는 스택 기반 할당자도 있다. 게임 프레임 동안 자동 힙 할당을 줄여 GC를 피하는 것이 이 구현의 목적이라고 설명한다.
구조와 빌드
게임은 기본 엔진에 모드로 얹는 구조다. 개발자는 이 방식으로 모드 API를 최신 상태로 유지하고 모드 접근을 장려하려 했다고 설명한다. Hedra에는 게임의 AI 로직, 구성 요소, 월드 생성, 모듈 시스템과 객체 배치 등이 들어간다. Hedra.Engine은 렌더링과 사운드, 기본 시스템, 창 관리, 게임 루프와 플랫폼 기능을 다루는 엔진 핵심부다. 구조를 처음부터 나눈 것은 아니어서 일부 기능은 여전히 다른 위치에 있을 수 있다.
Framework에는 엔진에서 쓰는 기본 자료형이 있다. 힙·스택 할당자와 자체 구현한 리스트·배열, 네이티브 포인터 래퍼 등이 포함된다. HedraTests는 테스트 스위트로 소개되지만 세부 설명은 이어지지 않는다. Asset Builder는 이미지와 모델, 사운드 파일, 셰이더를 빠른 데이터 검색을 위해 설계된 구조의 단일 바이너리 파일로 묶어 게임 에셋을 압축하는 명령줄 도구다.
Server는 과거 멀티플레이어를 지원했을 때 UDP 홀 펀칭을 이용해 클라이언트끼리 P2P로 통신하도록 돕던 서버다. 소개글은 엔진 코드에 네트워킹 관련 흔적이 남아 있을 수 있다고 덧붙인다.
저장소의 빌드 절차는 하위 모듈을 모두 체크아웃하고, 빌드 의존성 스크립트를 실행한 뒤, C# 솔루션을 컴파일하는 방식이다. GitHub Actions 워크플로에서 Linux와 Windows 빌드 예시를 확인할 수 있다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요