두 개의 태양

372025년 08월 21일5

WebGPU Samples 프로젝트는 순조롭게 진행되었다. Dawn 팀은 이제 단순한 엔진 개발자를 넘어, 자신들이 만든 도구의 가장 훌륭한 사용법을 전파하는 교사와 같은 역할을 수행하고 있었다. 개발자 커뮤니티의 반응은 뜨거웠고, 드미트리는 이 새로운 역할에서 깊은 보람을 느끼고 있었다.

그 평화로운 일상에, 인터넷의 반대편에서 거대한 파도가 밀려왔다.
모질라(Mozilla)의 공식 블로그에 새로운 소식이 게시되었다.

“Firefox 113 Ships WebGPU.”

크롬과 같은 버전 번호에 맞춘, 의도된 선언이었다.
그것은 단순히 또 하나의 브라우저가 신기술을 탑재했다는 뉴스가 아니었다. 이것은 WebGPU가 더 이상 구글 크롬만의 전유물이 아니라, 명실상부한 웹 표준으로서의 지위를 공고히 했음을 알리는, 생태계 전체의 승리 선언이었다.

Dawn 팀의 채팅방은 축제 분위기로 들끓었다.
“알렉스와 그의 팀이 해냈군!”
“wgpu의 승리다! Rust의 승리야!”

드미트리는 진심으로 기뻤다. 한때 경쟁자처럼 보였던 모질라는, 사실 이 길고 험난한 여정을 함께 걸어온 가장 든든한 동지였다. 두 개의 독립적인 구현체. 두 개의 태양이 마침내 웹이라는 하늘에 함께 떠오른 것이다.

하지만 축배를 들기엔 아직 일렀다. 드미트리는 축제 분위기를 가라앉히고, 팀에게 새로운 임무를 부여했다.

“이제부터 진짜 테스트가 시작됩니다. 우리가 만든 모든 공식 샘플들을, 오늘 출시된 파이어폭스 113 버전에서 하나도 빠짐없이 테스트해주십시오. 우리의 목표는 크롬에서 잘 돌아가는 코드를 만드는 것이 아니라, ‘어디서든’ 잘 돌아가는 코드를 만드는 것입니다.”

그의 지시에 따라, 팀원들은 각자 맡은 샘플들을 파이어폭스에서 실행하기 시작했다.
대부분의 샘플은 마치 복사해서 붙여넣기라도 한 듯, 크롬에서와 완벽하게 동일하게 동작했다. 이것이야말로 표준화의 위대한 힘이었다.

문제를 발견한 것은 벤이었다. 그는 복잡한 텍스처 포맷과 후처리 효과를 다루는 샘플을 테스트하고 있었다.
“드미트리, 이쪽으로 와서 이것 좀 보시죠.”

벤의 모니터에는 두 개의 브라우저 창이 나란히 떠 있었다. 왼쪽의 크롬에서는 이미지의 채도가 선명하고 풍부하게 표현되고 있었다. 하지만 오른쪽의 파이어폭스에서는 같은 이미지가 미세하게 물 빠진 듯한 색감으로 보였다. 에러는 없었다. 크래시도 없었다. 하지만 결과물이 ‘달랐다’.

이것은 개발자에게 가장 골치 아픈 종류의 버그였다. ‘미묘한 불일치’.

“색 공간(Color Space) 처리 문제 같은데… SRGB 변환 과정에서 뭔가 다른가?”
카이가 추측했다.

팀은 즉시 원인 분석에 착수했다. 그들은 코드를 최소화하여, 오직 텍스처를 화면에 그리는 가장 단순한 형태의 테스트 케이스를 만들었다. 그리고 그 테스트 케이스를 모질라의 wgpu 팀에게 전달하며, 공동 조사를 요청했다.

며칠 후, 드미트리는 모질라의 알렉스와 화상 회의를 진행했다. 화면 너머 알렉스의 표정도 진지했다.

“벤이 보내준 테스트 케이스를 분석해봤습니다, 드미트리. 결론부터 말하자면, 저희 wgpu의 구현은 사양을 정확히 따르고 있습니다.”
알렉스의 말에 드미트리는 의아함을 느꼈다.
“우리 Dawn 역시 사양을 따르고 있다고 확신합니다. 그렇다면 대체 어디서 차이가 발생하는 거죠?”

두 명의 천재 엔지니어는 화면에 문제의 WebGPU 사양 문서를 함께 띄웠다. 그리고 텍스처 포맷과 색 공간 변환에 대한 부분을 한 줄 한 줄, 단어 하나하나를 짚어가며 읽어 내려갔다.

그리고 마침내, 그들은 문제의 근원을 찾아냈다.
사양 문서의 한 구석에 있는, 아주 사소해 보이는 문장 하나였다.

“...when sampling from an sRGB-formatted texture, the hardware MAY perform the conversion to linear RGB...”

“MAY.”

‘~일 수 있다’. 그것은 강제 규정인 ‘MUST’도, 강력한 권고인 ‘SHOULD’도 아니었다. 하드웨어의 재량에 맡기는, 선택적 허용이었다.

알렉스가 탄식했다.
“이것 때문이었군. 우리 wgpu는 이 부분을 ‘구현체가 명시적으로 선형 변환을 수행해야 한다’고 보수적으로 해석했습니다. 하지만 Dawn은 ‘하드웨어가 알아서 처리하도록 맡겨둘 수 있다’고 해석한 것 같군요. 그리고 특정 하드웨어에서는 그 자동 처리가 미묘하게 다르게 동작하는 거고요.”

두 구현체 모두 틀리지 않았다. 둘 다 사양의 모호한 틈 안에서 각자의 방식으로 ‘올바르게’ 동작하고 있었다. 문제는 바로 그 ‘모호함’ 자체에 있었다.

드미트리는 깊은 깨달음을 얻었다.
API를 출시하는 것은 시작에 불과했다. 모든 브라우저가 동일한 API를 지원하게 만드는 것은 그 다음 단계였다. 그리고 진정한 마지막 단계는, 그 모든 브라우저가 API를 ‘동일하게 해석’하고, 픽셀 단위까지 똑같은 결과물을 만들어내도록 보장하는 것이었다.

그날 회의가 끝나고, 드미트리와 알렉스는 W3C 저장소에 공동으로 새로운 이슈를 등록했다.
제목: Clarification needed for color space conversion rule in sRGB sampling

이슈의 내용은 간단했다.
“‘MAY’를 ‘MUST’로 변경할 것을 제안합니다.”

두 개의 태양이 같은 하늘에 뜨자, 비로소 이전에는 보이지 않던 대기의 미세한 굴절까지 드러나기 시작했다. 진정한 의미의 웹 표준을 향한 여정은, 이제 막 새로운 국면으로 접어들고 있었다.