
옛날 게임 물 반사의 비밀: 뒤집힌 세상
한 줄 요약: 옛날 게임의 물 반사는 빛을 계산해서 만든 게 아니라, 세상을 물면 기준으로 통째로 뒤집어 물밑에 한 번 더 그려두고 반투명한 물 표면으로 덮은 것이에요.
Mozi.pick님이 올린 릴스 게시물이에요. 제목은 “옛날 게임이 물 반사를 구현한 방법”이고, GTA: 바이스 시티(2002)의 호텔 수영장 장면 두 개를 보여줘요. 위 장면은 풀 옆에서 본 수면인데, 건물과 야자수가 물에 흔들리며 반사돼 있어요. 아래 장면이 이 게시물의 핵심 증거예요. 카메라를 물밑으로 내려보내자, 수면 아래에 건물이 거꾸로 심겨 있는 게 그대로 보이거든요. 캡션은 “그냥 건물을 상하반전 해서 땅바닥에 심어버림”으로 요약해요. 이 방식이 실제 그래픽스에서 쓰던 기법이 맞는지 그래픽스 교과서 자료와 바이스 시티 역공학 소스로 확인해 봤는데, 기법 자체는 확실히 검증돼요. 다만 공개된 역공학 코드에서 반사 패스까지는 아직 확인되지 않아, 그 부분은 릴스의 장면과 기법 구조로 뒷받침해 설명해요.
물 반사가 어려운 이유
당시 게임기가 반사를 왜 못 그렸는지부터 볼게요. 2002년 콘솔의 그래픽 처리 방식은 래스터라이저라고 하는, ‘주어진 삼각형을 화면 어디에 그릴지’ 정해진 순서로 찍어내는 방식이에요. 이 파이프라인은 삼각형의 색칠은 잘하지만 반사 같은 빛의 경로 계산은 못 해요. 물에 비친 건물을 진짜로 계산하려면 화면의 점마다 ’물면에 부딪힌 빛이 어디서 왔는가’를 거꾸로 추적해야 하는데, 이게 바로 광선 추적이고 지금 하드웨어에서나 감당 가능한 작업이에요. 그런데 게임에는 물가에서 건물이 비치는 장면이 꼭 필요해요. 그래서 개발자들이 고안한 게 계산을 포기하고 복사로 바꾸는 발상이에요.
세상을 뒤집어 한 번 더 그리기
방법은 이래요. 물면을 거울이라고 정하고, 씬 전체를 물면 기준으로 상하반전한 좌표로 한 번 더 그려요. 물면 위에 있던 건물의 모습이 물밑에서도 거꾸로 이어지고, 수면을 경계로 두 세계가 대칭을 이루는 거예요. 이렇게 만든 뒤집힌 세계는 실제 지오메트리예요. 새로 그림을 그리는 게 아니라 이미 있는 건물 모델을 다른 좌표로 다시 찍는 것이니 새로운 데이터가 필요 없어요. 대신 씬을 두 번 그리니 그리기 횟수가 두 배가 되는데, 2002년 게임 세계는 폴리곤 수가 적어 이 정도는 감당 가능했어요. 그래픽스에서는 이를 평면 반사(planar reflection)라고 부르는 표준 기법으로, OpenGL 강의 노트에도 물체를 반전 공간에 그린 뒤 잘라내는 절차로 정리돼 있고, 코넬 대학의 그래픽스 강의 자료도 같은 다중 패스 방식을 설명해요. 여기에 물 영역 밖으로 뒤집힌 세계가 삐져나오지 않도록 물면 위쪽만 남기고 잘라내는 절차가 붙어요. 이 클리핑이 있기 때문에 위에서 볼 때는 반사만 보이고, 물밑 카메라로 내려가야만 릴스의 두 번째 장면처럼 반전 세계가 나타나요.
물밑에 보이는 반전 세계
릴스의 두 번째 장면을 다시 보면 이 구조가 그대로 드러나요. 물밑에서 위를 보니 수면 너머로 거꾸로 선 건물이 있고, 화면 아래쪽에는 원래 방향의 건물도 함께 보이죠. 뒤집힌 건물은 ’반사 이미지’가 아니라 실제로 렌더링된 지오메트리라서, 카메라가 물 아래로 내려가면 표면의 가림 없이 그대로 노출돼요. 참고로 같은 엔진 가족인 GTA III(2001)의 세이프하우스 욕실 거울도 이 평면 반사 계열의 기법으로 실시간 반사를 그린 것으로 유명하고, 바이스 시티의 실행 파일에는 미러(mirror) 시스템의 흔적이 남아 있어요. 다만 공개된 역공학 소스에 이 반사 패스의 코드가 아직 포함돼 있지는 않아, 어느 물 영역까지 이 방식을 썼는지 같은 구현 세부는 코드로는 단정하지 않아요. 기법의 구조와 릴스의 증거 장면은 서로 딱 맞아떨어져요.
물결과 반짝임은 위에 얹는다
완벽한 거울은 물답지 않으니, 물다운 흔들림은 별도의 층으로 얹어요. 바이스 시티의 역공학 소스에서 물 표면 렌더링 코드를 확인해 보면, 스크롤하는 물 텍스처와 시간에 따라 정점을 흔드는 물결 애니메이션, 그리고 ’waterreflection2’라는 환경맵 텍스처를 화면 공간에서 섞어 반짝임을 더하는 구조가 나와요. 즉 물밑의 반전 세계 위에 반투명한 물결 유리를 덮은 셈이에요. 위에서 보면 뒤집힌 세계가 이 유리를 거쳐 일그러지면서 진짜 물 반사처럼 보이고, 텍스처가 흐르면서 바람에 물결치는 느낌까지 더해져요.
어떻게 연결되나
이 게시물이 주는 교훈은 ’계산이 안 되면 같은 데이터를 다른 각도로 다시 그려라’는 데이터 재사용의 발상이에요. 새로운 연산을 발명하는 대신, 이미 갖고 있는 지오메트리를 반전 행렬로 한 패스 더 찍는 것만으로 거울이 완성돼요. 이 원리는 지금도 이어져요. 현대 게임의 화면 공간 반사(SSR)는 이미 그린 화면에서 반사를 찾아내고, 큐브맵은 미리 찍어둔 사방 풍경을 대신 비추고, 레이 트레이싱이 되어서야 비로소 진짜 빛 경로를 계산해요. 옛날 게임의 트릭이 조악한 게 아니라, 하드웨어 제약 안에서 정답에 가장 가까운 바로가기를 찾은 것이죠.
이 글의 출처