11주차 · 2026-03-23 ~ 29
PIC/FLIP 파티클 인스톨
지난 세 주 동안 병렬로 만들어 오던 PIC/FLIP 파티클 시스템과 부기스 인테리어가 이번 주에 합쳐졌고, Week 10 의 녹음이 파티클의 움직임을 구동하기 시작했다. 프로젝트 제목은 의도의 기술이 아니라 실제로 화면 위에서 벌어지는 일의 기술이 되었다.
이번 주까지 프로젝트는 두 개의 병렬 트랙이었다. PIC/FLIP 파티클 시스템은 Week 8 부터 존재했다, 아키텍처 맥락이 전혀 없는 중립 테스트 씬에서 돌아가면서. 부기스 인테리어는 Week 10 부터 존재했다, 종교적 공존이라는 개념을 중심으로 만든 유리 아키텍처, 그 안에 파티클은 없는 상태로. 두 반쪽은 각자 작동하고 있었다. 한 번도 만난 적이 없었을 뿐이다.
이번 주에 둘이 만났다. 부기스 인테리어 안의 연못이 파티클을 담기 시작했고, 파티클이 부기스에서 녹음한 오디오에 반응하기 시작했고, 내가 “Where Sounds Breathe” 라고 부르던 것이 제목이기를 멈추고 화면 위에서 벌어지는 어떤 일의 기술이 되기 시작했다.
통합을 위한 준비
통합은 기존 코드베이스 위에 그냥 얹힐 수 없었다. 시뮬레이션 영역, 인테리어 모델, 렌더 파이프라인은 각각 분리되어 사용될 것을 전제로 세팅되어 있었다. 파티클이 연못 안으로 들어가기 전에 몇 가지 인프라 조각이 먼저 다시 만들어져야 했다.
첫 번째는 시뮬레이션 영역 자체였다. 이 시점까지 PIC/FLIP 시뮬레이션은 월드 원점에 놓인 고정
박스 안에서 살고 있었다. 그 박스는 부기스 연못이 있는 곳이 아니었다. SimBoxEditor 를 확장해
부기스 인테리어가 자신의 시뮬레이션 영역 정의를 별도(bugis_sim_box_mesh.json) 로 가질 수
있게 했다. 에디터 자체에도 회전 모드와 PCA 기반 정렬 도구를 추가해, 시뮬레이션 영역이 월드
축이 아니라 연못 메시의 주축에 기울어 맞을 수 있게 했다.
두 개의 더 작은 변경이 중요했다. OBJ 캐시를 추가해 인테리어 메시가 인테리어에 들어갈 때마다 다시 파싱되지 않고 한 번만 파싱되도록 했고, 재진입 로드 시간이 몇 초에서 거의 0 으로 줄었다. 그리고 기즈모 피킹이 오브젝트 스케일을 고려하도록 수정해, 큰 인테리어 모델들(도시 블록, 종교 건물들) 을 확대하지 않고도 선택하고 옮길 수 있게 했다.
이 중 어느 것도 최종 경험에서는 보이지 않는다. 방문자는 시뮬레이션 영역 오버레이나 기즈모를 볼 일이 없다. 그러나 이번 주의 준비가 없었다면, 통합 작업은 내내 기존 코드 아키텍처와 싸워야 했을 것이다.
통합
파티클이 3월 26일에 연못 안으로 들어갔다. 처음 보인 결과는 이상했다. 파티클이 올바른 위치에 나타났지만, 연못의 형태가 내가 기대한 방식대로 유체를 안내하지 못했다. 시뮬레이션 영역은 직사각형 박스였고, 연못 메시는 그 안에 들어 있는 곡선의 유기적 형태였다. 연못 메시 바깥이지만 영역 박스 안에 있는 파티클들도 계속 시뮬레이션되고 있었고, 즉 연못이 없는 자리에도 유체가 존재하고 있었다.
해결은 두 부분이었다. 시뮬레이션 월드 원점을 고정된 월드 좌표에서 연못의 축 정렬 바운딩 박스 (AABB) 의 한쪽 코너로 옮겨, 시뮬레이션 그리드가 실제로 중요한 영역만 덮도록 했다. 이로써 SDF (signed distance field) 해상도가 연못 내부에 집중되고 주변 빈 공간에 정밀도를 낭비하지 않게 되었다. 그리고 깊이 오클루전 패스를 다시 써서, 파티클의 뷰 공간 Z 를 인테리어의 깊이 텍스처와 선형 공간에서 비교하도록 했다. 연못 가장자리나 주변 유리 아키텍처 뒤에 지오메트리적으로 놓인 파티클들이 올바르게 가려지게 하기 위해서였다.
연못 표면과 그 아래의 바닥 수면 사이의 작은 z-fighting 이슈는 바닥에 polygon_offset 을
적용해 해결했다. 바닥의 깊이를 외관은 그대로 유지한 채 카메라로부터 살짝 더 멀리 밀어내는
방식이다. 작은 디테일. 원인을 이름 붙이기까지 이틀 동안 수면이 깜빡이게 만들고 있던 문제였다.
처음 통합된 프레임. 지평선에는 유리 도시, 그 앞에 놓인 연못의 파티클 베드, 프로젝트의 두 반쪽이 드디어 같은 씬 안에 들어왔다.
파티클이 연못 안에서 올바르게 동작하기 시작하자 다음 문제는 스케일이었다. 5만 개의 파티클은 Week 8 의 비어 있는 테스트 씬에서는 괜찮았다. 부기스 인테리어는 수십만 삼각형의 유리 아키텍처, HDRI 스카이박스, 볼류메트릭 포그, 반사되는 바닥을 이미 지고 있었다. 그 위에 기존 이코스피어 지오메트리로 50만 개의 파티클을 렌더하는 것은 프레임레이트를 사용 가능한 수준 아래로 떨어뜨렸다.
해법은 빌보드 렌더링이었다. 각 파티클이 320 삼각형의 작은 구 대신 2 삼각형의 카메라 지향 쿼드가 되었다. 쿼드의 프래그먼트 셰이더는 픽셀마다 레이-스피어 교차를 계산하므로 파티클은 여전히 구형으로 보이고 그림자도 올바르게 드리운다, 그러나 정점 부하는 약 160 배 가벼워진다. 이 변경 하나로 화면상 보이는 결과를 거의 바꾸지 않고 프레임레이트가 복구됐다.
통합이 움직이는 상태. 빌보드 렌더링, 올바른 깊이 오클루전, 연못 메시 안에서 형상을 유지하는 유체.
오디오와 파티클의 만남
통합 그 자체는 기술적 마일스톤이었다. 그것을 프로젝트의 핵심으로 만든 일은 그 뒤에 일어났다. Week 10 에 녹음한 13개의 레코딩이 오디오 파일로 놓여 있었다. 이번 주에 그것들이 파티클 시스템을 구동하기 시작했다.
셋업은 audio_analyzer 모듈이다. 녹음을 재생하면서 매 프레임 FFT 를 돌려 세 개의 주파수
대역(베이스·미드·트레블) 과 합성 에너지 값을 추출한다. 이 네 값이 매 프레임 GPU 에 유니폼으로
업로드된다. 파티클 컴퓨트 셰이더가 이 값을 읽어 유체에 힘을 가한다.
Week 10 의 Marina Jung Morgan 의 조언이 이 작업 내내 머리 뒤쪽에 있었다.
힘의 설계가 그 원칙을 따랐다. 큰 스케일의 움직임은 녹음의 앰비언트 에너지가 구동한다. 작고 읽히는 디테일이 그 위에 나타난다. 여섯 개의 다른 힘이 블렌드되어 유체의 최종 동작을 만들고, 여섯 모두가 기여하지만, 그 중 몇 개가 관람자에게 실제로 읽히는 것들이다.
-
트레블이 만드는 물방울 리플
녹음의 짧은 고주파 성분은 유체 표면에 국지적 리플을 만든다. 각 리플은 유체를 잠깐 바깥쪽으로 밀어내고 사라지는 작은 힘의 원점이다. 어느 순간에도 12 개의 그런 리플 원점이 활성 상태이고, 3 분의 1 초마다 위치가 다시 해시되어 재배치된다. 덕분에 표면에는 항상 어딘가에서 작은 디테일 이벤트가 일어나지만 패턴을 예측할 수는 없다. Marina 가 말한 상징적 디테일이 가시화되는 방식이 이것이다. 녹음 안의 횡단보도 삑 소리가 연못의 리플이 된다.
-
베이스가 만드는 방사형 펄스
베이스 성분은 더 크고 더 느린 펄스를 구동한다. 연못 위에 5 개의 펄스 중심이 분포되어 있고, 베이스 주파수가 피크를 칠 때 각 중심이 유체를 바깥쪽으로 밀어낸다. 트레블 리플과 달리 이 펄스는 이벤트라기보다 무게로 읽힌다. 유체가 부풀었다가 가라앉는다. 녹음에 지속적인 낮은 울림이 있을 때 유체 표면은 연속적인 호흡 운동을 한다.
-
앰비언트 베드가 만드는 표면 파동
녹음의 앰비언트 에너지, Marina 가 “장소를 특정하게 만드는 것” 이라고 말한 그것이 연속적인 저주파 표면 파동을 구동한다. 이것은 이벤트가 아니라 상수다. 항상 일어나고 있고, 녹음의 현재 순간에서 앰비언트가 얼마나 큰지에 따라 진폭이 달라진다. 각 녹음에 고유한 베이스라인 성격을 부여하는 힘이 이것이다. 관음당 사원 녹음은 호커 센터 녹음과 다른 파형을 가지고, 유체의 베이스라인 형태가 그 차이를 반영한다.
두 개의 추가 힘 (베이스와 미드가 동시에 강할 때 활성화되는 느린 보텍스, 합성 에너지가 높은 임계치를 넘을 때만 발사되는 월드 전체 폭발) 이 위의 세 가지 위에 얹힌다. 이 두 힘은 충분히 드물게 일어나서 리듬이 아니라 구두점처럼 느껴진다.
유체의 색도 오디오에 반응한다, 다만 매핑은 전역이 아니라 공간적이다. 베이스가 높을 때 유체 전체가 빨갛게 되는 게 아니라, 베이스는 사인 패턴으로 연못을 가로질러 드리프트하는 따뜻한 색 존을 만든다. 미드는 다른 주파수로 티일-그린 밴드를 같은 방식으로 만든다. 트레블은 매 프레임 바뀌는 해시 기반 랜덤 위치에 밝은 스파클 포인트를 만든다. 결과적으로 같은 순간에도 연못의 다른 부분이 다르게 보이고, 오디오가 진행하면서 패턴도 진화한다.
통합 버전에서 뽑은 두 프레임이 부기스 녹음의 서로 다른 상태에서 이것이 어떻게 보이는지를 보여 준다.
오디오가 파티클과 만나는 순간. 앰비언트 베드가 느린 표면 파동을 구동하고, 베이스가 색 존을 펄스로 밀고, 트레블이 그 위에 리플을 튀긴다.
개발 중 놀랐던 것 하나는 FFT 의 정규화가 얼마나 중요했는가였다. 앰비언트 녹음은 음악보다 훨씬 낮은 에너지를 갖는다, 그리고 기본 FFT 스케일링은 부기스 녹음 대부분에 가시적 반응을 만들어 내지 못했다. 에너지를 공격적으로 부스팅해야 했다 (베이스는 8 으로, 미드는 4 로, 트레블은 2 로 날 에너지를 나눔) 반응이 유용한 가시 범위에 들어오도록. 이게 없으면 관음당 사원 녹음은 유체가 거의 완전히 정지한 것처럼 보였다. 있으면, 같은 녹음이 분명하고 읽히는 움직임을 구동한다.
최종 결과 · 주차 마감 상태