DEV NOTE · STUDIO

다음 게임 PRISM 설계 미리보기: 빛의 경로가 곧 규칙인 WebGPU 퍼즐

PRISM은 아직 출시되지 않은 다음 게임이다. 지금 있는 것은 2026년 10월 13일에 작성한 설계 문서 v0.1뿐이고, 코드는 첫 마일스톤도 시작하기 전이다. 그래도 이 글을 먼저 쓰는 이유는 우리 작업 방식이 코드보다 설계 문서를 먼저 쓰고 그것을 기준으로 삼기 때문이다. 유리와 금속으로 된 작은 디오라마에서 빛줄기를 반사·굴절·분광시켜 꺼진 수정 수신기를 깨우는 3D 퍼즐이며, 아래 내용은 모두 계획이고 플레이 테스트를 거치며 바뀔 수 있다.

현재 상태: 설계 문서 v0.1 단계, 미출시. rogagame.com에서 아직 플레이할 수 없다. 이 글의 수치는 전부 설계 문서의 가설이다.

그래픽이 장식이 아니라 규칙이 되는 게임

PRISM의 목표는 이 사이트에서 가장 높은 그래픽 품질이다. 다만 화려함만 노리면 퍼즐이 보이지 않는 게임이 되기 쉽다. 그래서 출발점을 "그래픽 자체가 규칙"인 소재로 잡았다. 빛이 어디로 꺾이는지, 어떤 색이 되는지가 곧 퍼즐의 답이고, 그 과정을 최대한 아름답게 그리는 것이 곧 규칙을 잘 보여 주는 일이 된다.

규칙은 다섯 줄로 정리되어 있다. 판 위의 광원이 백색이나 단색 빔을 쏘고, 수정 수신기는 각자 요구하는 색이 있다. 플레이어는 인벤토리의 조각을 빈 칸에 놓고 탭으로 45도씩 돌린다. 모든 수신기가 정확히 요구 색으로 동시에 켜지면 클리어이고, 틀린 색이 들어간 수신기는 붉게 깜빡인다. 조각은 거울, 프리즘, 분할기, 필터, 결합기, 렌즈 블록, 그리고 월드 3에서 등장하는 위상 문까지 일곱 종류다.

연속 물리 대신 8방향 이산 광선을 고른 이유

실제 광학처럼 빛을 연속 각도로 계산하면 보기에는 사실적이지만 퍼즐로는 다루기 어렵다. 미세한 각도 차이로 답이 갈리면 플레이어는 규칙을 읽는 대신 손끝을 맞추는 게임을 하게 된다. 무엇보다 생성기와 솔버가 모든 경우를 셀 수 없다. PRISM은 판을 정사각 격자로 나누고 빛이 8방향, 즉 45도 단위로만 움직이게 했다. 이렇게 하면 광선 추적이 완전히 결정적이 되고, 게임 화면과 솔버와 헤드리스 테스트가 같은 trace() 함수를 공유할 수 있다.

색 처리도 같은 방향으로 단순화했다. 색은 3비트로 R=1, G=2, B=4이고, 결합기는 비트 OR, 필터는 비트 AND다. 노랑은 R과 G를 합친 3, 백색은 7이 된다. 프리즘에 백색이 들어오면 R은 -45도, G는 직진, B는 +45도로 갈라지고, 단색이 들어오면 +45도로 굴절만 한다. 경로 길이에는 제한이 없지만 같은 칸, 같은 방향, 같은 색 상태를 두 번 지나면 루프로 보고 추적을 끝낸다. 거울 두 장이 마주 보는 배치에서 무한 루프에 빠지지 않게 하는 장치다.

생성기와 솔버: 기존 게임에서 가져온 방식

레벨은 수제 튜토리얼 12개와 날짜 시드로 만드는 DAILY, 무작위 시드의 FREE로 구성한다. 시드 레벨은 SLINGSTAR와 STARLINK에서 쓰던 "생성기가 만들고 솔버가 보증한다"는 방식을 그대로 가져온다. 생성은 역방향이다. 8×8에서 10×10 판에 광원을 놓고, 무작위 조각 시퀀스로 빔을 전진시켜 해답 경로를 먼저 만든 다음 그 끝에 해당 색의 수신기를 둔다. 그 뒤 해답 조각을 인벤토리로 회수하고 고정 조각, 장애물, 미끼 조각을 섞는다.

솔버는 조각 배치와 회전 상태를 너비 우선 탐색한다. 조각은 5개 이하, 상태는 20만 개 이하로 묶어 두었다. 솔버는 해가 존재하는지 확인하는 동시에 최소 조작 수를 구해 이를 PAR로 쓴다. 해가 2개를 넘으면 미끼를 줄여 다시 만든다. 검증 기준은 node prism/tests/gen.mjs 200으로 시드 200개가 전부 풀리고 평균 생성 시간이 50ms 미만인 것이다. 점수는 기본 1000에 수신기당 200을 더하고 PAR 이하로 풀면 1.5배, PAR보다 1~3번 더 쓰면 1.2배를 준다. 별 셋은 PAR 이하, 별 둘은 PAR+3 이하다.

STARLINK 퍼즐 화면. 숫자가 적힌 별들이 사이안과 마젠타 선으로 연결되고 보라색 소용돌이 중력 별 두 개가 있다
STARLINK. 시드 결정적 생성기와 유일해 풀이기를 갖춘 퍼즐로, PRISM의 생성기·솔버 설계가 이 구조를 이어받는다.

렌더링: WebGPU를 쓰되 셰이더는 한 벌로

렌더러는 Three.js의 WebGPURenderer와 노드 기반 셰이더 언어인 TSL을 쓰기로 했다. WebGPU를 지원하지 않는 기기에서는 같은 TSL 코드가 WebGL2로 자동 폴백된다. 셰이더를 두 벌 유지하지 않아도 된다는 점이 결정적이었다. 라이브러리는 다른 게임과 마찬가지로 prism/vendor/에 라이선스 파일과 함께 복사하고 import map으로 불러온다. 빌드 없는 정적 배포와 폴더별 오프라인 캐시 규칙을 깨지 않기 위해서다.

빛 표현이 규칙과 직결되므로 빔 색은 규칙상의 색을 그대로 쓴다. 빔은 가산 혼합 원통에 흐르는 노이즈 셰이더와 블룸을 입히고, 프리즘은 투과·굴절률 1.5·분산(dispersion)을 쓴 유리 재질로 만든다. 출구에서는 무지개 부채꼴 파티클이 나온다. 후처리는 장면 패스 다음에 GTAO, 화면 공간 반사, 블룸, TRAA, AgX 톤 매핑, 필요할 때 CAS 샤프닝 순서다. 외부 3D 모델과 HDRI는 쓰지 않는다. 지오메트리, 텍스처, 환경맵을 모두 코드로 생성해 "자체 제작" 원칙을 지킨다.

해상도 계획은 ECHO에서 먼저 검증했다

품질 프리셋은 LOW부터 ULTRA까지 네 단계다. LOW는 WebGL2에 FXAA, ULTRA는 WebGPU에 1.5배 슈퍼샘플링, TRAA, 전체 해상도 반사, 4096 그림자를 쓴다. AUTO는 첫 실행 때 2초 벤치마크로 등급을 정한다. 내부 해상도는 기기 픽셀 비율, 슈퍼샘플링 배율, 동적 해상도 배율을 곱한 값이고 830만 픽셀(4K)을 넘지 않는다.

이 공식은 PRISM에서 처음 시도하는 것이 아니다. 같은 날 버전을 올린 ECHO 2.1.0에 먼저 넣어 검증했다. 1초 평균 프레임이 20ms를 넘으면 해상도를 15% 낮추고(최저 60%), 안정되면 5%씩 되돌린다. 설계 문서의 변경 이력에는 ECHO에서 동적 해상도가 1.0에서 0.6으로 내려갔다가 0.9로 복귀하는 것을 확인했다고 적혀 있다. 3D 게임 하나에서 검증한 것을 다음 게임의 기본값으로 삼는 순서다. PRISM에는 여기에 PHOTO 모드를 더할 계획이다. 화면을 2×2에서 4×4 타일로 나눠 오프스크린으로 렌더링한 뒤 합쳐 4K나 8K PNG로 저장하므로, 실시간 성능과 상관없이 최고 화질의 공유 이미지를 만들 수 있다.

ECHO 3D 화면. 부감 시점의 어두운 던전에서 사이안 음파 링과 보라색 원, 손전등 불빛이 비친 바닥이 보인다
ECHO 2.x. 동적 해상도와 슈퍼샘플링 공식을 이 게임에서 먼저 구현하고, PRISM은 그 수치를 기본값으로 이어받는다.

무엇을 확인하고 나서 출시할까

마일스톤은 M0부터 M5까지 여섯 단계다. 빈 장면과 백엔드 감지에서 시작해 2D 디버그 뷰의 광선 추적, 3D 빔과 유리, 생성기와 솔버, 후처리와 품질 프리셋을 거쳐 마지막에 나머지 조각과 수제 12스테이지, 오디오, 허브 카드, PWA를 붙인다. 측정 계획에는 "그래픽이 규칙을 방해하지 않는다"는 가설이 첫 줄에 있다. 첫 스테이지 클리어율 90% 이상, 클리어 시간 중앙값 60초 이하가 목표이고, 이 수치가 나오지 않으면 연출을 줄이는 쪽으로 고친다.

정리

PRISM 설계의 요점은 사실적인 광학을 포기하고 8방향 이산 규칙을 고른 데 있다. 그 덕분에 기존 퍼즐 게임의 생성기·솔버 방식을 그대로 쓸 수 있고, 남는 계산 예산을 렌더링에 몰아줄 수 있다. 출시 전까지 설계 문서의 수치는 여러 번 바뀔 것이고, 바뀔 때마다 변경 이력에 근거를 남긴다. 그때까지는 같은 계열의 퍼즐인 STARLINK로 시드 퍼즐이 어떤 느낌인지 먼저 확인할 수 있다.