본 프로젝트는 Minecraft를 재현하는 것을 목표로 하며, OptiX 기반의 실시간 경로 추적과 CUDA를 활용한 GPU 가속 지형 생성을 핵심으로 합니다. 이를 통해 기존 래스터화 방식보다 사실적인 조명, 그림자, 반사를 구현하고, 다양한 노이즈 함수와 암시적 표면을 이용해 거대한 생물군계 지형을 빠르게 생성합니다.
핵심 포인트
OptiX를 사용한 실시간 경로 추적으로 사실적인 렌더링 구현
CUDA 기반 GPGPU 프로그래밍으로 지형 생성 가속화 달성
다양한 노이즈 함수와 암시적 표면을 활용한 생물군계 표현
Minecraft의 게임 플레이 경험을 고도화한 기술 프로젝트
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
이 프로젝트는 두 가지 주요 업그레이드, 즉 OptiX를 사용한 **실시간 경로 추적(real-time path tracing)**과 CUDA를 사용한 **GPU 가속 지형 생성(GPU-accelerated terrain generation)**을 통해 Minecraft를 재현하는 것을 목표로 합니다.
Minecraft는 래스터화(rasterization)와 블록 기반 조명 시스템으로 렌더링되며, 이는 게임 플레이에 매우 잘 작동합니다. Minecraft 셰이더는 그림자 매핑(shadow mapping), 스크린 공간 반사(screen space reflections), 동적 조명(dynamic lighting)과 같은 기능을 도입하여 이를 한 단계 끌어올립니다. 이 프로젝트는 RTX 가속 OptiX 프레임워크를 사용하여 경로 추적만으로 전체 렌더링을 수행함으로써, 사실적인 조명, 그림자 및 반사를 제공하며 그보다 더 나아갑니다.
또한, CUDA를 이용한 GPGPU 프로그래밍은 다양한 노이즈 함수와 암시적 표면(implicit surfaces)으로 구성된 환상적인 지형을 빠르게 생성할 수 있게 합니다. 이 프로젝트의 지형은 각각 고유한 특성과 구조를 가진 여러 개의 뚜렷한 생물군계(biome)로 이루어져 있습니다. 플레이어는 세계를 탐험하면서 거대한 보라색 버섯, 광활한 모래 언덕, 감염된 지하 숲 등 수많은 볼거리를 발견할 수 있습니다.
이 README는 프로젝트의 다양한 부분에 대한 개요와 개별 기능에 대한 더 자세한 설명을 제공합니다.
조작법 (Controls)
프로젝트를 실행하면 사용할 수 있는 여러 가지 조작법이 있습니다.
WASD: 수평 이동
Q: 하강 비행, E 또는 space: 상승 비행
마우스: 주변 보기
LShift: 더 빠르게 비행
Z: 화살표 키 조작을 토글(toggle)하며, 이는 주변 보기를 위해 마우스를 대체합니다.
C 누르기: 확대 (zoom in)
P: 시간 일시정지/재개 (pause/unpause time)
[와 ]: 시간상 뒤로 및 앞으로 이동
F: 프리 캠 모드(free cam mode)를 토글하며, 이는 새로운 청크의 생성을 비활성화하고 멀리 떨어진 청크의 언로딩을 수행합니다.
CUDA 지형 생성 (CUDA Terrain Generation)
무한한 절차적 세계(procedural world)는 Minecraft의 판매 포인트 중 하나이지만, 지형은
높이 필드(heightfields)나 표면 생물군계(surface biomes)와 같은 일부 단계는 주변 청크에 대한 정보 없이 단일 청크에서 수행될 수 있습니다. 하지만 지형층(terrain layers)이나 침식(erosion)과 같은 일부 단계는 청크 경계를 따라 불연속성을 방지하기 위해 주변 청크로부터 정보를 모으는 것이 필요합니다. 다음 드롭다운 섹션에서 각 단계별 요구 사항을 설명합니다:
<details>
<summary>높이 필드 및 표면 생물군계</summary>
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/chunk_gen/single_chunk.png" width="20%" />
<br>
<em>높이 필드와 표면 생물군계를 생성할 때는 단일 16x16 청크(파란색)만 고려합니다.</em>
<br> </details>
<details>
<summary>지형층</summary>
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/chunk_gen/single_chunk_1_block_border.png" width="20%" />
<br>
<em>지형층을 생성하려면 이 청크의 높이 필드(파란색) 경사를 계산하기 위해 주변 청크로부터 패딩 데이터(orange)를 수집해야 합니다.</em>
<br> </details>
<details>
<summary>침식</summary>
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/chunk_gen/erosion.png" width="20%" />
<br>
<em>침식은 각 측면에 6개의 청크 패딩(보라색)이 있는 12x12 크기의 청크 영역(녹색)을 고려합니다.</em>
<br> </details>
<details>
<summary>동굴 및 동굴 생물군계</summary>
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/chunk_gen/single_chunk.png" width="20%" />
<br>
<em>높이 필드와 표면 생물군계와 마찬가지로, 동굴 및 동굴 생물군계를 생성할 때는 단일 청크(파란색)만 고려합니다.</em>
<br> </details>
<details>
<summary>지형 특징 배치</summary>
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/chunk_gen/features.png" width="20%" />
<br>
<em>지형 특징을 생성하기 위해, 각 청크는 자신(녹색)과 최대 3 청크 떨어진 모든 청크를 고려합니다(보라색).</em>
<br> </details>
<details>
<summary>청크 채우기</summary>
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/chunk_gen/single_chunk.png" width="20%" />
<br>
<em>모든 데이터가 수집되면, 이 단계는 하나의 커널 호출로 전체 청크(파란색)를 채웁니다.</em>
</details>
시간에 걸쳐 부하를 분산하고 지연 시간 급증(lag spikes)을 방지하기 위해 스케줄링에 '액션 시간(action time)' 시스템을 사용합니다. 매 프레임마다, 지형 생성기는 이전 프레임 이후 경과된 시간에 비례하여 액션 시간을 얻습니다. 특정 양으로 프레임당 액션 시간이 제한되어 있어 어떤 한 프레임도 너무 많은 작업을 수행하지 않도록 보장합니다. 각 액션에는 해당 단계의 평균 지속 시간에 대한 경험적 측정치로 결정되는 비용이 할당되며, 이 비용은 누적된 액션 시간에서 차감됩니다. 예를 들어, 현재 우리는 초당 최대 30,000의 액션 시간을 누적하고 프레임당 최대 500의 액션 시간을 허용합니다. 청크의 높이장(heightfield) 및 표면 생물군계(surface biomes)를 생성하는 것은 비교적 비용이 적게 들기 때문에, 그 비용은 청크당 단지 3에 불과합니다. 그러나 침식(erosion)은 한 번에 24x24 크기의 청크 영역에 걸쳐 실행되며 상대적으로 비용이 많이 들기 때문에, 그 비용은 24x24 영역당 무려 500입니다.
별도로 지정되지 않는 한, 인접 청크에서 데이터를 수집하는 단계를 제외한 모든 지형 생성 단계는 CUDA 커널을 사용하여 GPU에서 수행됩니다. 또한, 발사 오버헤드를 줄이기 위해 작은 커널들을 메가-커널(mega-kernels)로 결합했습니다. 예를 들어, 100개 청크의 높이필드(heightfields)를 생성하고 싶다면, 각각에 대해 하나의 커널을 실행하는 대신 모든 데이터를 하나의 긴 메모리 섹션으로 통합하여 단일 커널을 실행함으로써 모든 처리를 수행할 수 있습니다. 이는 CUDA 스트림(streams) 및 비동기 발사(asynchronous launches)와 결합되어 놀라울 정도로 빠른 속도로 지형을 생성할 수 있게 합니다.
높이필드 및 표면 생물군계
청크의 첫 번째 단계는 높이필드를 생성하고 표면 생물군계를 결정하는 것입니다. 표면 생물군계는 X축과 Z축 위치만을 고려하는 반면, 동굴 생물군계(나중에 논의됨)는 Y축도 함께 고려합니다. 모든 생물군계는 습도, 온도, 암석스러움 등 여러 속성에 따라 배치되며, 이는 노이즈 함수(noise functions)를 사용하여 결정됩니다. 예를 들어, 정글 표면 생물군계는 바다나 해변이 아니면서, 덥고, 습하며, 마법적이고, 암석스럽지 않은 지형 기둥에 해당합니다. 이러한 노이즈 함수는 또한 생물군계 간의 부드러운 보간(interpolation)을 가능하게 하여, 모든 표면 생물군계의 가중치와 모든 동굴 생물군계의 가중치가 각각 1을 더하도록 합니다. 각 기둥의 생물군계와 높이가 다른 모든 기둥과 독립적이기 때문에, 이 과정은 GPU 병렬화에 매우 적합합니다.
생물군계(Biomes)는 어떤 블록이 배치될지뿐만 아니라 지형의 높이와 어떤 지형 특징이 생성될지를 결정합니다. 예를 들어, 레드우드 숲 생물군계(redwood forest biome)는 잔디와 레드우드 나무를 가지지만, 바위 해변 생물군계(rocky beach biome)는 자갈을 가지고 있으며 눈에 띄는 지형 특징은 없습니다. 두 생물군계 모두 비교적 유사한 높이장(heightfields)을 가집니다. 이러한 특성들은 각 생물군계별 가중치(weight)를 사용하여 경계 지역에서 혼합됩니다.
높이와 표면 생물군계가 결정된 후, 다음 단계는 지형층을 생성하고 침식 시뮬레이션을 수행하는 것입니다. 저희의 기법은 Procedural Generation of Volumetric Data for Terrain (Machado 2019)에 기반을 두고 있습니다. 먼저, 다양한 재료(돌, 흙, 모래 등)의 층들이 fBm 노이즈 함수를 사용하여 생성됩니다. 각 층은 기본 높이와 변화에 대한 매개변수를 가지며, 다른 생물군계들은 또한 서로 다른 층들에 더 많은 또는 적은 가중치를 할당할 수 있습니다. 층의 높이는 또한 생물군계의 가중치에 따라 표면 생물군계 사이에서 부드럽게 보간됩니다.
최상층은 흙(dirt), 모래(sand), 자갈(gravel)과 같은 재료로 이루어진 '느슨한(loose)' 층으로 구성됩니다. 느슨한 층의 높이는 지형의 경사도에 의해 부분적으로 결정되는데, 이를 위해서는 해당 청크 주변의 8개 청크를 모아와야만 청크 가장자리의 경사도를 파악할 수 있습니다. 모든 층을 배치한 후에는 가장 낮은 느슨한 층부터 시작하여 가장 높은 층까지 침식이 진행됩니다. 전통적인 침식 시뮬레이션은 한 기둥에서 주변 기둥으로 물질을 이동시키는 방식이지만, 저희는 Machado가 제안한 '경사도 방법(slope method)'을 사용합니다. 이 방법은 특정 기둥이 주변 기둥들과의 층 높이 차이가 너무 클 경우 해당 기둥에서 물질을 제거하는 원리입니다.
<p align="center">
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/slope_method.png" width="40%" />
<br>
<em>슬로프 방법(slope method) 논문에서 가져온 일러스트레이션으로, 여기서 α는 이웃한 층 사이의 최대 각도(재료별로 정의됨)입니다.</em>
</p>
이 과정은 지형 변화가 더 이상 없을 때까지 반복됩니다. 하지만 특정 영역의 침식은 주변 지형 데이터에 의존하기 때문에, 청크 단위로 이 과정을 수행하면 불연속성을 초래할 수 있습니다. 이러한 이유로 저희는 전체 12x12 '영역(zone)'의 청크와 각 측면에 추가로 6개씩의 패딩(padding) 청크를 모아 와서 전체 24x24 크기의 청크 영역에 대해 침식을 수행합니다. 이후, 중앙 영역의 침식된 데이터는 유지하고 패딩 청크의 데이터는 폐기합니다.
침식은 특히 가파른 지역에서 더 자연스러운 지형을 만듭니다. 예를 들어, 정글 생물군계(jungle biome)에서는 침식이 언덕진 지역의 지하 돌(subterranean stone)을 노출시키는 반면, 비교적 평평한 지역은 대부분 무시합니다.
<p align="center">
<img src="https://raw.githubusercontent.com/AdityaGupta1/mega-minecraft/HEAD/screenshots/readme/jungle_erosion.png" width="65%" />
<br>
<em>비교적 평평한 왼쪽 부분은 대부분 잔디로 남아 있는 반면, 경사가 더 급한 오른쪽 부분에는 훨씬 더 많은 돌이 노출된 것을 주목하십시오.</em>
</p>
동굴 및 동굴 생물군계(Caves and cave biomes)
지형 침식(terrain erosion)이 완료되면 동굴이 지형에서 파냅니다. 주요 동굴은 Worley's Caves라는 Minecraft 모드에서 큰 영감을 받았습니다. 이름에 걸맞게, 이 동굴들은 Worley 노이즈의 수정된 버전을 사용하여 무한히 가지를 치는 터널과 넓은 개방 공간을 생성합니다. 대부분의 동굴은 완전히 지하에 숨겨져 있지만, 지형 전반에 걸쳐 위치한 협곡(ravines)이 지하 세계로의 접근을 제공합니다.