실험 삼아 16KB짜리 FPS 게임을 '바이브 코딩'으로 만들어 봄
Vibe coded a 16 KB FPS game as an experiment
핵심 요약
Claude를 활용해 16KB 용량의 소나 기반 FPS 게임을 개발한 실험적 프로젝트입니다.
- 바이브 코딩 — Claude 모델을 활용해 복잡한 데모씬 기술 없이 게임 구현함
- 게임 컨셉 — 소나 펄스로 지형을 파악하고 소리에 반응하는 적을 피하는 FPS
- 최적화 기술 — 셰이더 기반 레이캐스팅과 텍스처 데이터 활용으로 용량 극대화
- 생성형 음악 — LCG 알고리즘을 사용해 게임 내에서 실시간으로 음악 생성

원래라면 데모씬(demoscene)에 대한 깊은 지식이 있어야 만들 수 있는 걸, 그냥 감으로 코딩해서 어디까지 갈 수 있나 한번 해봤다. 결과적으로 16KB짜리 작은 FPS 게임 하나가 뚝딱 나왔네.
초기 기획에는 Fable 5 High를 썼고, 구현이랑 다듬기, 최적화는 Opus 5.5 High로 밀어붙였다.
게임 내용: 넌 앞이 안 보이는 상태로 지하에 갇혀 있어. 소나 펄스를 세 가지 주파수로 쏠 수 있는데, 펄스를 쏘면 벽이랑 적들이 잠깐 보였다가 다시 희미한 잔상만 남고 사라짐. 근데 펄스 쏠 때마다 소음이 발생해서, 지하에 있는 것들이 전부 소리 듣고 쫓아온다. 3개 레벨에 적 3종류, 보스 하나, 함정이랑 다리도 있고 음악도 생성형으로 돌아감.
최적화 기법:
-
레벨은 64×64 셀 그리드인데, 프래그먼트 셰이더에서 레이캐스팅(2D DDA)으로 돌렸음. 여기서 430바이트 정도 아껴서 펄스 그림자, 가짜 AO, 절차적 벽 패턴 넣는 데 썼다.
-
매 프레임마다 CPU가 float 텍스처(64×90 RGBA32F) 하나를 새로 씀. 여기에 셀 정보, 적 리스트, 펄스, 램프, HUD 텍스트, 심지어 폰트 비트까지 다 때려 박았음. 카메라 yaw, pitch, 종횡비는
glRects하나에 텍스처 좌표로 실어서 보냄. 유니폼 제로, 행렬 제로, 드로우 콜 딱 한 번. -
적들은 부품(둥근 박스랑 "팔다리" 세그먼트, 부품당 7바이트)으로 만든 SDF(Signed Distance Fields)인데, 부드럽게 합치고 구체 추적(sphere-traced)으로 구현함. 크롤러는 다리 6개가 실제로 움직이게 만들었다. 가까이서 보면 느려지길래 부품마다 바운딩 스피어 씌워서 셰이더가 건너뛰게 만듦.
-
SSE2 대신 x87, cdecl 대신 stdcall 썼고, 인라인은 껐음. Crinkler 해시 테이블은 100MB 대신 300MB로 잡았다.
-
음악은 생성형임. 마디마다 작은 LCG가 다이아토닉 진행에서 코드를 하나 뽑고, 패드랑 베이스, 아르페지오가 효과음이랑 같은 신디사이저로 연주함.
소스 코드 및 실행 파일: https://github.com/zTrojan/blind-sector

