WebGPU 1.0의 시대는 안정기에 접어들었다. Dawn 팀은 이제 거대한 폭풍우를 헤쳐 나온 노련한 선원들처럼, 잔잔한 바다 위에서 유지보수와 소소한 성능 개선 작업을 수행하고 있었다. 그들의 연구실은 치열함 대신 전문적인 여유로움으로 채워져 있었다.
그 여유로운 오후를 뒤흔든 것은, 언리얼 엔진(Unreal Engine)으로 유명한 에픽게임즈(Epic Games)의 그래픽 R&D 팀으로부터 온 한 통의 기술 데모였다.
드미트리는 팀원들과 함께 회의실 대형 스크린으로 데모를 재생했다. 화면에는 수십만 개의 소행성이 흩어져 있는 광활한 우주 공간이 펼쳐졌다. 단순한 파티클이 아니었다. 각 소행성은 저마다 다른 모양과 크기, 회전 값을 가진 고유한 3D 객체였다. 카메라가 소행성 지대를 뚫고 나아가자, 시야에 들어오는 소행성들은 놀랍도록 부드럽게 렌더링되었다.
“성능이 대단한데요. 역시 WebGPU입니다.”
벤이 감탄하며 말했다.
하지만 데모를 공유한 에픽게임즈의 엔지니어, 마일스의 표정은 그리 밝지 않았다. 그는 화면 한쪽에 성능 프로파일러를 띄웠다.
“보시다시피, GPU는 여유롭습니다. WebGPU의 렌더링 처리량은 저희의 기대를 뛰어넘고 있죠. 하지만… 문제가 있습니다.”
그는 프로파일러의 다른 부분을 확대했다. CPU 사용률 그래프였다. 하나의 CPU 코어가 거의 100%에 육박하며 붉게 타오르고 있었다.
마일스가 설명했다.
“이 장면에는 수십만 개의 소행성이 존재하지만, 카메라 시야에 실제로 들어와 그려져야 하는 객체는 수천 개에 불과합니다. 저희 엔진은 매 프레임마다 CPU를 사용해서, 이 수십만 개의 객체 중 어떤 것을 그릴지, 어떤 것을 그리지 않을지를 결정하는 ‘컬링(Culling)’ 작업을 수행합니다. 그리고 컬링을 통과한 객체들에 대한 드로우 콜(Draw Call)을 준비해서 WebGPU에 보내주죠.”
그는 한숨을 쉬었다.
“문제는 객체의 수가 너무 많아지자, 이 ‘무엇을 그릴지 결정하는’ CPU 작업 자체가 병목이 되어버렸다는 겁니다. GPU는 더 많은 것을 그릴 준비가 되어 있는데, CPU가 명령서를 준비하느라 너무 바빠서 GPU에게 제때 일을 주지 못하는 상황입니다. 우리는 WebGL의 망령을 다시 보고 있습니다.”
그의 말에 연구실은 찬물을 끼얹은 듯 조용해졌다.
WebGL 시대의 CPU 병목. 그들은 그 괴물을 퇴치했다고 생각했다. 하지만 그 괴물은 렌더링 명령 전달이라는 영역에서는 사라졌지만, 이제는 ‘렌더링 대상을 결정하는’ 영역에서 다른 모습으로 부활한 것이다.
이것은 WebGPU 1.0의 근본적인 한계였다. 아무리 GPU가 빨라져도, 결국 무엇을 그릴지는 CPU가 결정해서 알려줘야 한다는 구조적 한계.
회의가 끝나고, 팀원들은 깊은 고민에 빠졌다.
“인스턴스드 렌더링(Instanced Rendering)을 최적화해도 한계가 있을 겁니다. CPU 컬링의 부하는 피할 수 없어요.”
“결국 객체의 수를 줄이는 수밖에 없는 걸까요? 그건 웹의 가능성을 다시 제한하는 일입니다.”
모두가 뾰족한 수를 찾지 못하고 있을 때, 드미트리가 조용히 입을 열었다.
“우리가 잘못된 질문을 하고 있는지도 몰라. ‘어떻게 하면 CPU가 이 일을 더 빨리 할 수 있을까?’가 아니라, ‘왜 이 일을 CPU가 해야만 하는가?’라고 물어야 해.”
그는 화이트보드에 다가갔다.
“만약, 이 컬링 작업 자체를 GPU에게 넘겨버릴 수 있다면 어떨까?”
그의 말에 모두의 시선이 집중되었다.
“CPU는 그저 수십만 개 소행성의 전체 데이터 덩어리를 GPU에게 한 번만 던져주는 거야. 그리고 GPU에게 이렇게 말하는 거지. ‘여기 모든 재료가 있다. 이 중에서 카메라 안에 보이는 것들만 골라서, 네가 알아서 요리해라.’ 라고.”
GPU가 스스로 ‘무엇을 그릴지’ 결정하게 만드는 기술.
그것은 더 이상 미래의 막연한 꿈이 아니었다. 이미 Vulkan과 DirectX 12 최신 버전에는 그 기술이 존재했다.
드미트리는 화이트보드에 그 기술의 이름을 적었다.
Mesh Shader (메시 셰이더)
카이가 탄성을 터뜨렸다.
“맙소사… 버텍스 셰이더의 패러다임을 완전히 뒤엎는 거군요. 고정된 정점 데이터를 입력받는 대신, 셰이더가 직접 지오메트리를 생성하고 폐기할 수 있게 만드는 것. 컬링, LOD(Level of Detail) 선택, 지오메트리 생성을 모두 GPU 안에서 끝내버리는…”
이것은 WebGPU 1.0의 연장선에 있는 기능이 아니었다. 그래픽스 파이프라인의 근본적인 동작 방식을 바꾸는, 또 다른 차원의 혁명이었다.
하지만 동시에 엄청난 도전이었다. 하드웨어 지원도 제한적이었고, W3C에서의 표준화 논의는 이제 막 걸음마를 뗀 단계였다.
드미트리는 팀원들을 둘러보았다. 그들의 눈에는 더 이상 평화로운 여유로움이 없었다. 대신, 새로운 병목을 돌파하고, 웹의 한계를 다시 한번 밀어붙여야 한다는 사명감과 함께, 거대한 미지의 산을 마주한 탐험가의 투지가 불타오르고 있었다.
그들은 WebGPU 1.0이라는 안락한 고지를 스스로 떠나, 메시 셰이더라는 더 높고 험준한 다음 봉우리를 향한 등반을 시작할 준비를 하고 있었다. 새로운 시대의 두 번째 전쟁이, 이제 막 서막을 올리고 있었다.