WebGL의 뼈대가 될 OpenGL ES 2.0이 결정되자, 워킹 그룹의 회의실은 새로운 종류의 열기로 가득 찼다. 이제부터는 추상적인 철학 논쟁이 아니라, 코드 한 줄 한 줄의 명운을 결정하는 구체적인 설계 작업에 돌입해야 했다.
그들의 과제는 ‘API(Application Programming Interface) 설계’였다.
API는 응용 프로그램(Application)이 운영체제나 라이브러리의 기능(Interface)을 사용할 수 있도록 약속된 통신 규칙(Programming)의 집합이다.
블라디미르는 API를 식당의 ‘메뉴판’과 같다고 생각했다.
손님(웹 개발자)은 주방(GPU) 안에서 무슨 일이 일어나는지 알 필요가 없다. 그저 메뉴판(API)을 보고, 자신이 원하는 요리(기능)를 주문(함수 호출)하면 된다. 그러면 웨이터(브라우저)가 주문을 받아 주방에 전달하고, 주방장은 주문서에 적힌 대로 요리를 만들어 손님에게 내어준다.
지금 WebGL 워킹 그룹이 하는 일은, 바로 그 ‘메뉴판’을 만드는 작업이었다. 전 세계 모든 웹 개발자가 만족하고, 모든 브라우저라는 레스토랑이 동일하게 제공할 수 있는 단 하나의 메뉴판.
테이블 위에는 OpenGL ES 2.0의 모든 함수 목록이 펼쳐져 있었다. 수백 개에 달하는 명령어 리스트. 그들은 이 중에서 WebGL 메뉴판에 올릴 메뉴와 뺄 메뉴를 결정해야 했다.
첫 번째 원칙은 ‘보안’이었다.
OpenGL ES 2.0의 함수 중에는 시스템의 상태를 직접 조회하거나, 컴파일된 셰이더 프로그램의 바이너리 코드를 직접 가져오는 등의 강력한 기능들이 있었다.
“glGetProgramBinary
같은 함수는 절대 안 됩니다.”
애플의 보안 담당 엔지니어가 단호하게 말했다. “컴파일된 셰이더 코드를 웹페이지가 직접 들여다볼 수 있게 하는 건, 드라이버의 내부 구조를 노출시켜 새로운 공격 루트를 열어주는 것과 같습니다. 메뉴판에서 당장 빼야 합니다.”
그의 의견에 이견을 다는 사람은 없었다. 조금이라도 시스템 보안에 위협이 될 수 있는 함수들은 가차 없이 목록에서 지워졌다.
두 번째 원칙은 ‘단순화와 일관성’이었다.
OpenGL에는 역사적인 이유로, 같은 기능을 하는 여러 가지 방식의 함수가 존재하는 경우가 있었다. 예를 들어, 셰이더에 데이터를 전달하는 glUniform*
계열의 함수들은 정수, 실수, 벡터, 행렬 등 데이터 타입별로 수십 가지의 변형이 존재했다.
glUniform1f, glUniform2f, glUniform3f, glUniform4f
glUniform1i, glUniform2i, glUniform3i, glUniform4i
glUniformMatrix4fv
…
“이걸 전부 자바스크립트로 가져오는 건 낭비입니다.”
구글의 엔지니어가 제안했다. “자바스크립트는 C++처럼 타입이 엄격하지 않습니다. 함수 하나로 숫자, 배열, 타입 배열(Typed Array)을 모두 처리할 수 있도록 더 유연한 방식으로 통합해야 합니다.”
이 제안은 격렬한 토론을 낳았다. 기존 OpenGL 개발자들의 익숙함을 존중해야 한다는 의견과, 웹 개발자들의 편의성을 우선해야 한다는 의견이 맞섰다. 몇 번의 논쟁 끝에, 그들은 C++ 스타일의 수많은 함수를 자바스크립트의 특성에 맞게 몇 개의 함수로 통합하고 단순화하는 방향으로 합의를 이뤄나갔다.
gl.uniform3f(loc, 1.0, 2.0, 3.0)
같은 형식과 gl.uniform3fv(loc, [1.0, 2.0, 3.0])
같은 배열 형식을 모두 지원하는 식으로, 유연성을 더하는 타협안이 도출되었다.
회의는 끝없이 이어졌다. 함수 하나의 이름을 정하는 데 반나절이 걸리기도 했고, 인자의 순서나 데이터 타입을 놓고 며칠씩 논쟁하기도 했다. 모든 결정은 신중해야 했다. 한번 표준으로 정해진 API는 되돌리기 거의 불가능하기 때문이다.
블라디미르는 이 지루하고 소모적인 과정이야말로 ‘표준’을 만드는 가장 중요한 핵심이라고 생각했다. 한 회사가 독단적으로 결정하는 것이 아니라, 다양한 배경을 가진 전문가들이 모여 논쟁하고 타협하며 최선의 합의점을 찾아가는 과정.
그들의 손끝에서 WebGL의 메뉴판, 즉 API 명세서가 한 줄 한 줄 채워지고 있었다. 그것은 미래의 웹 개발자들이 사용하게 될 가장 기본적인 언어이자, 브라우저가 GPU와 소통하는 유일한 약속이 될 터였다.