행렬(Matrix), 3D 공간을 지배하는 수학.

282025년 08월 16일4

버퍼와 텍스처, 셰이더라는 강력한 도구들이 마련되었다. 하지만 이 도구들을 조화롭게 사용해 3D 객체를 움직이고, 원하는 위치에서 바라보게 하려면 반드시 넘어야 할 산이 있었다. 바로 ‘수학’, 그중에서도 ‘선형대수학(Linear Algebra)’이었다.

특히 3차원 공간 변환의 핵심인 ‘행렬(Matrix)’은 WebGL API 설계에서 피할 수 없는 주제였다.

정점 셰이더 코드의 핵심은 gl_Position = projectionMatrix * viewMatrix * modelMatrix * position; 이 한 줄에 요약되어 있었다. 개발자는 이 세 가지 행렬(모델, 뷰, 투영)을 자바스크립트 세상에서 직접 계산하여 uniform 변수로 셰이더에 넘겨줘야 했다.

문제는 자바스크립트라는 언어 자체에는 행렬이나 벡터를 다루기 위한 내장 기능이 전혀 없었다는 점이다.

“개발자들이 직접 4x4 행렬의 곱셈 코드를 매번 작성하게 할 수는 없습니다. 너무 번거롭고, 실수하기도 쉽습니다.”
모질라의 한 엔지니어가 우려를 표했다. C++이나 C# 같은 언어들은 보통 그래픽 라이브러리에서 벡터와 행렬을 다루는 클래스를 기본적으로 제공했지만, 웹 환경은 그렇지 않았다.

이 문제를 두고 워킹 그룹 내에서는 두 가지 의견이 팽팽하게 맞섰다.

첫 번째 의견은 ‘WebGL API 자체에 수학 라이브러리를 포함시키자’는 것이었다.
gl.createMatrix()matrix.multiply(otherMatrix) 같은 헬퍼(Helper) 함수들을 WebGL 표준에 포함시켜야 합니다. 개발자들이 행렬 연산의 부담에서 벗어나 핵심 로직에만 집중할 수 있도록 도와야 합니다.”
이 주장은 개발 편의성을 최우선으로 생각하는 이들에게 큰 지지를 받았다.

하지만 반론도 만만치 않았다.
“WebGL의 역할은 GPU에 대한 저수준의 접근을 제공하는 것입니다. 그 이상은 안 됩니다.”
구글의 엔지니어가 단호하게 선을 그었다. “수학 라이브러리는 너무나 주관적인 영역입니다. 어떤 사람은 왼손 좌표계를 선호하고, 어떤 사람은 오른손 좌표계를 씁니다. 행렬 데이터를 열 우선(Column-major)으로 저장할지, 행 우선(Row-major)으로 저장할지에 대한 논쟁도 끝이 없습니다. 만약 WebGL이 특정 방식의 수학 라이브러리를 표준으로 채택한다면, 다른 방식을 선호하는 개발자들에게는 오히려 족쇄가 될 겁니다.”

그의 주장은 WebGL을 ‘라이브러리가 아닌, 플랫폼’으로 보아야 한다는 철학에 기반하고 있었다. WebGL은 가장 근본적이고 핵심적인 기능만 제공하고, 그 위에서 다양한 스타일의 수학 라이브러리들이 자유롭게 경쟁하며 생태계를 만들어가야 한다는 것이다.

“자바스크립트 커뮤니티의 힘을 믿어야 합니다.”
블라디미르가 후자의 의견에 힘을 실었다. “표준이 모든 것을 해결해주려 하면 오히려 비대해지고 유연성을 잃게 됩니다. 우리가 해야 할 일은 행렬 데이터를 TypedArray 형태로 셰이더에 효율적으로 전달할 수 있는 통로(gl.uniformMatrix4fv)를 명확하게 제공하는 것까지입니다. 행렬을 어떻게 만들고 계산할지는 전적으로 개발자의 자유에 맡겨야 합니다.”

긴 토론 끝에, 워킹 그룹은 후자의 손을 들어주었다.
WebGL API는 행렬이나 벡터 연산을 위한 핼퍼 함수를 포함하지 않는다.

이 결정은 WebGL의 정체성을 다시 한번 명확히 했다. WebGL은 ‘쉽게 쓰는’ 도구가 아니라, ‘강력한 기반’을 제공하는 플랫폼이라는 것.

이 결정은 훗날 엄청난 결과로 이어졌다.
WebGL API 자체는 비교적 저수준에 머물렀지만, 그 빈자리를 채우기 위해 수많은 훌륭한 자바스크립트 3D 라이브러리들이 탄생했다.

대표적인 것이 바로 Three.js였다. Three.js는 자체적으로 강력하고 사용하기 쉬운 벡터/행렬 수학 라이브러리를 내장하고, 장면(Scene), 카메라(Camera), 조명(Light)과 같은 고수준의 객체들을 제공함으로써 개발자들이 WebGL의 복잡한 내부 동작을 몰라도 손쉽게 3D 콘텐츠를 만들 수 있게 해주었다.

결과적으로 워킹 그룹의 선택은 옳았다. 그들은 모든 것을 다 해주려는 비대한 표준 대신, 날렵하고 강력한 기반을 제공했다. 그리고 그 위에서 자바스크립트 생태계가 스스로 꽃을 피우도록 길을 열어주었다.

이제 3D 공간을 지배하는 수학적 원칙은 정해졌다. 남은 것은 이 모든 조각들을 맞추어 실제 하드웨어와 브라우저 위에서 벌어질 수많은 예외와 버그들을 잡아내는, 지루하고도 고통스러운 디버깅의 시간이었다.