보이지 않는 손길

732025년 09월 08일5

Dawn 엔진이 두 개의 심장을 품고 각자의 길을 나아가는 동안, 드미트리는 한 걸음 더 물러나 생태계 전체를 조망하고 있었다. 그의 시선은 이제 Dawn의 내부 코드가 아닌, WebGPU를 둘러싼 ‘보이지 않는 손길’들에 머물러 있었다.

그중 하나는 바로 브라우저의 ‘컴포지터(Compositor)’였다.
컴포지터는 웹 페이지의 각기 다른 부분들—HTML 텍스트, 이미지, 비디오, 그리고 WebGPU 캔버스—을 모아 최종적으로 하나의 화면으로 합성하는, 브라우저의 숨은 일꾼이었다.

문제를 처음 제기한 것은 한 웹 기반의 증강현실(AR) 라이브러리 개발자였다.
그는 깃허브 이슈에 이런 글을 올렸다.
“저희는 스마트폰 카메라 영상 위에 WebGPU로 렌더링한 3D 객체를 겹쳐서 보여주고 있습니다. 그런데 3D 객체의 투명한 부분 뒤로 비치는 카메라 영상의 색상이, 저희가 의도한 것과 미묘하게 다르게 보입니다. 마치 무언가 추가적인 색상 보정이 적용되는 것 같습니다.”

이 이슈는 처음에는 WebGPU의 블렌딩(Blending) 문제나 텍스처 포맷 문제로 여겨졌다. Dawn 팀의 엔지니어들이 며칠간 코드를 분석했지만, WebGPU 파이프라인 자체에서는 어떤 문제도 발견할 수 없었다.

드미트리는 이 문제가 WebGPU의 영역을 벗어난 곳에 있을지도 모른다고 직감했다. 그는 크롬의 컴포지터 팀에 직접 연락하여 공동 조사를 제안했다.

컴포지터 팀의 리드 엔지니어, 마리아는 드미트리와 함께 크롬의 렌더링 과정을 가장 깊은 곳까지 추적하기 시작했다. 그들은 브라우저의 모든 렌더링 단계를 시각화해주는 내부 디버깅 도구, ‘Viz(Visualizer)’를 사용했다.

Viz의 화면에는 웹 페이지가 여러 개의 ‘레이어(Layer)’로 분해되어 표시되었다. 하나는 카메라 영상을 담은 비디오 레이어, 다른 하나는 WebGPU가 렌더링한 3D 객체를 담은 캔버스 레이어. 그리고 컴포지터는 이 두 개의 레이어를 GPU 위에서 최종적으로 합성하고 있었다.

문제는 바로 그 ‘합성’ 과정에 있었다.
마리아가 설명했다.
“범인은 저희 쪽에 있었습니다. 저희 컴포지터는 성능 최적화를 위해, 여러 개의 레이어를 합성할 때 특정 조건 하에서 제한된 정밀도의 색상 포맷을 사용하고 있었습니다. 대부분의 웹 콘텐츠에서는 문제가 되지 않지만, AR처럼 미묘한 색상과 투명도 처리가 중요한 경우에는, 이 과정에서 미세한 색상 정보 손실이 발생했던 겁니다.”

WebGPU는 완벽한 색상 정보를 담은 텍스처를 컴포지터에게 전달했다. 하지만 그 결과물을 최종적으로 화면에 뿌리는 컴포지터가, 그 완벽한 그림에 자신도 모르게 작은 흠집을 내고 있었던 것이다.

이것은 드미트리에게 새로운 깨달음을 주었다.
그는 지금까지 WebGPU를 하나의 완결된 세계라고 생각했다. 하지만 사실 WebGPU는 브라우저라는 거대한 도시 안에 있는 하나의 잘 설계된 건물일 뿐이었다. 그 건물이 아무리 튼튼하고 아름다워도, 도시의 다른 기반 시설—도로, 상하수도, 전력망—과 제대로 연결되지 않으면 제 기능을 다할 수 없었다.

컴포지터는 바로 그 기반 시설 중 하나였다.

드미트리와 마리아는 이 문제를 해결하기 위한 방안을 논의했다.
마리아가 제안했다.
“저희 컴포지터가 WebGPU 캔버스와 다른 레이어를 합성할 때, 더 높은 정밀도의 포맷을 사용하도록 로직을 수정할 수 있습니다. 하지만 이건 모든 WebGPU 콘텐츠에 일괄적으로 적용하기엔 성능 부담이 있습니다.”

드미트리가 아이디어를 냈다.
“그렇다면, 개발자가 선택할 수 있게 합시다. 캔버스 컨텍스트를 configure할 때, 새로운 옵션을 추가하는 겁니다. alphaMode: 'premultiplied' 와 같은 기존 옵션 옆에, colorSpace: 'display-p3' 와 같이, 자신이 원하는 색 공간과 정밀도를 명시적으로 요구하는 거죠. 컴포지터는 이 정보를 보고, 해당 캔버스에 대해서만 특별한 처리 방식을 적용하는 겁니다.”

이것은 WebGPU와 컴포지터라는, 서로 다른 두 세계를 잇는 새로운 ‘규약’을 만드는 것이었다.
WebGPU는 컴포지터에게 ‘이 캔버스는 특별한 주의가 필요합니다’라고 알려주고, 컴포지터는 그 신호를 받아 자신의 동작을 조절한다.

이 제안은 W3C의 CSS 워킹 그룹과 WebGPU 워킹 그룹의 공동 논의 안건으로 상정되었다. 서로 다른 표준을 다루던 두 그룹이, 하나의 문제를 해결하기 위해 처음으로 머리를 맞댄 것이다.

이 사건을 계기로, 드미트리는 더 이상 자신의 팀 안에만 머무르지 않았다. 그는 브라우저의 다른 팀들—네트워킹, DOM, 접근성 팀—과 적극적으로 소통하기 시작했다.

그는 깨달았다.
진정한 플랫폼 엔지니어는, 자신이 쌓아 올린 벽돌의 견고함만을 생각하는 사람이 아니라는 것을.
자신의 벽돌이 다른 수많은 벽돌과 어떻게 맞물려, 도시 전체의 조화와 균형에 기여하는지를 고민하는 사람이라는 것을.

그의 시야는 이제 WebGPU라는 하나의 건물을 넘어, 브라우저라는 거대한 도시 전체의 청사진을 향하고 있었다. 그는 그 보이지 않는 손길들의 복잡한 상호작용을 이해하고, 그 사이를 흐르는 데이터의 강줄기를 더 원활하게 만드는, 도시의 설계자가 되어가고 있었다.