WebGPU가 웹의 새로운 표준으로 자리 잡아가는 동안, 구글의 개발자 포럼에는 꾸준히 올라오는 질문이 하나 있었다. 그것은 마치 새로운 왕의 대관식에서, 옛 왕의 안위를 묻는 백성의 목소리 같았다.
“그래서, WebGL은 이제 어떻게 되는 건가요? 지원이 중단됩니까? 저희가 만든 기존의 WebGL 콘텐츠들은 모두 버려야 하나요?”
이 질문은 Dawn 팀 내부에서도 중요한 화두였다.
팀 회의실.
벤이 다소 급진적인 의견을 냈다.
“솔직히, 이제 WebGL은 역사적 소명을 다했다고 봅니다. 장기적으로는 WebGL 지원을 중단(Deprecate)하고, 모든 개발자가 WebGPU를 사용하도록 유도하는 것이 맞습니다. 두 개의 그래픽 스택을 동시에 유지보수하는 것은 엄청난 비용이니까요.”
그의 말은 공학적인 관점에서 합리적이었다. 중복되는 코드를 제거하고, 더 새롭고 우수한 기술에 집중하는 것. 효율성을 중시하는 엔지니어에게는 당연한 결론이었다.
하지만 카이가 신중하게 반론을 제기했다.
“그렇게 간단한 문제가 아닙니다. 지금 이 순간에도 전 세계 수백만 개의 웹사이트와 애플리케이션이 WebGL 위에서 동작하고 있습니다. 우리가 하루아침에 지원을 중단한다면, 웹의 가장 중요한 가치인 ‘하위 호환성’을 우리 스스로 무너뜨리는 셈입니다. 그건 웹 생태계에 대한 배신 행위가 될 수 있습니다.”
회의실의 분위기는 팽팽해졌다. 진보와 안정. 미래와 과거. 두 개의 가치가 충돌하고 있었다.
모두의 시선이 드미트리에게로 향했다. 그는 WebGPU의 선봉장이었지만, 동시에 WebGL이 다양한 플랫폼에서 동작하도록 만든 ANGLE 프로젝트의 핵심 공신이기도 했다. 그는 누구보다 WebGL의 영광과 한계를 잘 알고 있었다.
드미트리가 조용히 입을 열었다.
“둘 다 틀린 말이 아닙니다. 우리는 WebGL을 버릴 수 없습니다. 하지만 두 개의 그래픽 스택을 영원히 유지보수하는 것도 현명한 방법은 아니죠. 그렇다면… 방법은 하나입니다.”
그는 화이트보드에 그림을 그리기 시작했다.
[ WebGL API ] -> [ ??? ] -> [ Dawn Engine (WebGPU) ]
“우리가 WebGL을 버리는 것이 아니라, WebGL을 ‘품는’ 겁니다.”
팀원들은 의아한 표정으로 다이어그램을 바라보았다.
드미트리가 설명을 이어갔다.
“여러분, ANGLE 프로젝트를 기억하십니까? ANGLE의 본질은 ‘번역기’였습니다. OpenGL ES(WebGL의 기반) 명령을 DirectX로 번역해서 윈도우에서 실행시켜줬죠. 나중에는 Vulkan이나 Metal로도 번역할 수 있게 되었고요.”
그는 물음표가 그려진 상자를 가리켰다.
“이제 우리는 ANGLE에 새로운 번역 모드를 추가하는 겁니다. WebGL API 호출을, 우리가 만든 WebGPU API 호출로 번역하는 거죠.”
그 순간, 연구실에는 침묵과 함께 경탄의 기류가 흘렀다.
이것은 발상의 전환이었다.
WebGL을 독립된 별개의 엔진으로 취급하는 대신, WebGPU라는 더 거대하고 현대적인 엔진 위에서 동작하는 하나의 ‘호환성 계층’으로 재정의하는 것.
카이가 눈을 빛내며 말했다.
“그렇다면… 브라우저는 결국 단 하나의 그래픽 백엔드, 즉 Dawn만 유지보수하면 되는군요! WebGL 호출은 내부적으로는 모두 WebGPU 명령으로 바뀌어 실행될 테니까요. 코드베이스는 단순해지고, 유지보수 비용은 줄어듭니다.”
벤 역시 흥분을 감추지 못했다.
“그뿐만이 아닙니다. 모든 그래픽 호출이 결국 WebGPU의 검증 계층을 통과하게 되니, 구형 WebGL 코드의 보안성까지 덤으로 향상되는 효과가 있겠군요!”
이것은 모두를 만족시키는, 경이롭도록 우아한 해법이었다.
WebGL은 사라지지 않는다. 오히려 더 안전하고 효율적인 기반 위에서 계속 살아남게 된다. 사용자나 개발자는 아무것도 바꿀 필요가 없다. 그들의 오래된 코드는 자신도 모르는 사이에 최신 엔진의 심장 위에서 뛰게 될 것이다.
드미트리는 팀에게 새로운 프로젝트를 할당했다.
‘ANGLE on WebGPU’.
이 프로젝트는 WebGL에 대한 사형 선고가 아니었다. 그것은 지난 10년간 웹 3D 시대를 이끌어 온 낡은 영웅에게, 새로운 시대의 품 안에서 영원한 안식과 명예를 찾아주는 마지막 임무였다.
며칠 후, 드미트리의 모니터에 오래된 WebGL 1.0 데모 페이지가 떠 있었다. 화면에는 단순한 큐브 몇 개가 돌아가고 있었다. 하지만 그가 연 성능 분석 도구의 내부 호출 스택에는, gl.drawArrays
같은 낡은 이름 대신 GPURenderPassEncoder.draw
와 같은 새로운 이름들이 빛나고 있었다.
낡은 시대의 영웅은 죽지 않았다. 다만, 새로운 시대의 갑옷을 입고 자신의 자리를 묵묵히 지키고 있을 뿐이었다. 드미트리는 그 모습을 보며, 진정한 진보란 과거를 지우는 것이 아니라, 과거를 존중하며 함께 나아가는 것임을 다시 한번 깨달았다.