시간이 흘러 2010년대 후반에 이르자, 그래픽스 세계에는 또 한 번의 거대한 지각 변동이 일어나고 있었다.
마이크로소프트는 DirectX 12를, 애플은 메탈(Metal)을, 그리고 크로노스 그룹은 벌칸(Vulkan)이라는 새로운 세대의 그래픽 API를 발표했다. 이들의 공통점은 한 가지였다. 기존의 OpenGL이나 DirectX 11보다 훨씬 더 ‘낮은 수준(Lower-level)’에서 GPU 하드웨어를 직접 제어할 수 있게 해준다는 것.
OpenGL과 같은 구세대 API는 개발자의 편의를 위해 많은 부분을 자동화하고 추상화했다. 예를 들어, 그래픽 드라이버는 개발자가 요청한 그리기 명령들을 내부적으로 분석하여 언제, 어떻게 GPU에 전달할지를 스스로 결정했다. 편리했지만, 이는 숙련된 개발자가 직접 최적화할 수 있는 여지를 제한하는 ‘보이지 않는 벽’이 되기도 했다.
하지만 메탈과 벌칸 같은 신세대 API는 달랐다.
그들은 드라이버의 역할을 최소화하고, 메모리 관리, 작업 동기화, 커맨드 버퍼 생성 등 거의 모든 제어 권한을 개발자에게 넘겨주었다. 이는 개발자에게 더 많은 책임과 복잡성을 요구했지만, 그 대가로 GPU의 성능을 한계까지 짜낼 수 있는 엄청난 자유를 주었다. 특히 여러 개의 CPU 코어를 활용하여 렌더링 명령을 병렬로 준비하는 데 매우 유리했다.
이러한 변화의 바람은 당연히 웹에도 불어왔다.
WebGL 2.0은 훌륭했지만, 그 기반인 OpenGL ES 3.0은 여전히 구세대 API의 패러다임에 머물러 있었다. 웹 게임과 고성능 애플리케이션 개발자들은 WebGL이 제공하는 것 이상의 성능과 제어권을 원하기 시작했다.
“왜 자바스크립트는 여전히 싱글 스레드로만 렌더링 명령을 준비해야 합니까? 웹 워커(Web Workers)를 이용해 여러 스레드에서 동시에 그리기 작업을 준비하고 싶습니다.”
“GPU 메모리 할당을 좀 더 세밀하게 제어해서 불필요한 낭비를 줄이고 싶습니다.”
이러한 요구에 부응하기 위해, 2017년 W3C(World Wide Web Consortium)의 ‘GPU for the Web’ 커뮤니티 그룹에서 새로운 논의가 시작되었다. 그들의 목표는 WebGL의 차기 버전(WebGL 3.0)을 만드는 것이 아니었다. 그들은 처음부터 완전히 새로운 API를 설계하기로 결정했다.
그 이름은 바로 ‘WebGPU’였다.
WebGPU는 WebGL의 후속 기술이지만, 철학적으로는 정반대의 길을 걷는다.
-
상태(State)를 최소화한다: WebGL이 수많은 전역 상태에 의존하는 상태 기계였던 것과 달리, WebGPU는 상태를 파이프라인 상태 객체(Pipeline State Object, PSO)라는 불변의 객체에 캡슐화한다. 이를 통해 상태 관리의 복잡성을 줄이고, 렌더링 설정의 재사용성을 높인다.
-
명령(Commands)을 분리한다: WebGL에서는 상태 설정과 그리기 명령이 뒤섞여 있었지만, WebGPU에서는 명령을 기록하는 ‘커맨드 인코더(Command Encoder)’와 이를 제출하는 ‘큐(Queue)’가 명확히 분리된다. 이 구조 덕분에 여러 웹 워커에서 동시에 커맨드 버퍼를 생성하는 진정한 멀티스레드 렌더링이 가능해진다.
-
API를 현대화한다: WebGPU는 특정 그래픽 API(OpenGL, Metal, Vulkan, DirectX 12)에 종속되지 않는다. 대신, 이 모든 현대적인 API들의 공통적인 개념을 추상화한 중간 계층의 역할을 한다. 브라우저는 개발자가 작성한 WebGPU 코드를 사용자의 운영체제에 맞는 네이티브 그래픽 API(예: 윈도우에서는 D3D12, macOS에서는 Metal)로 변환하여 실행한다.
이것은 WebGL이 닦아놓은 길 위에서 출발하는 또 다른 거대한 여정이었다. WebGL이 웹에 3D를 ‘가져오는’ 것이 목표였다면, WebGPU는 웹을 네이티브 플랫폼과 ‘동등한’ 성능을 내는 곳으로 만드는 것이 목표였다.
블라디미르는 이 새로운 흐름을 흥미롭게 지켜보았다. WebGPU의 설계 문서에는 WebGL을 만들며 얻었던 수많은 교훈들이 녹아 있었다. 보안 모델, 프로세스 분리 아키텍처, 자원 관리 등 WebGL이 피와 땀으로 개척한 기반이 없었다면 WebGPU는 시작조차 할 수 없었을 것이다.
WebGL의 시대가 저무는 것이 아니었다. WebGL은 웹 그래픽스의 대중화를 이끌고, 더 쉽고 안정적인 3D 경험을 위한 표준으로 계속 남을 것이다. 그리고 WebGPU는 그 옆에서, 성능의 한계에 도전하는 전문가들을 위한 새로운 길을 열어줄 터였다.
WebGL이 뿌린 씨앗에서, 이제 더 크고 강력한 나무가 자라나기 시작하고 있었다. 웹의 진화는 결코 멈추지 않았다.