불변의 청사진, 파이프라인
제6화
발행일: 2025년 08월 05일
NXT 프로젝트의 심장부인 Command Encoder와 Queue가 설계되자, 팀의 분위기는 한껏 고무되었다. 그러나 그 흥분은 곧 다음 단계의 거대한 장벽 앞에서 숙연함으로 바뀌었다.
“자, 이제 ‘명령 기록관(Command Encoder)’에게 무슨 말을 시킬지 정해야 합니다.”
드미트리가 화이트보드에 CommandEncoder
라고 적고 그 아래에 물음표를 그렸다.
한 젊은 엔지니어가 자신 있게 입을 열었다.
“간단하지 않나요? WebGL처럼, 정점 데이터를 설정하는 함수, 사용할 텍스처를 지정하는 함수, 그리고 마지막으로 ‘그려라(draw)’라고 명령하는 함수를 추가하면 될 것 같습니다.”
그럴듯한 제안이었다. 개발자들에게 익숙하고, 직관적으로 이해하기 쉬운 방식. 하지만 그 말을 듣는 순간, 드미트리의 표정이 미세하게 굳어졌다. 그것은 그들이 벗어나려고 몸부림치던 바로 그 과거의 굴레였다.
“그렇게 하면… 우리는 아무것도 바꾸지 못하는 겁니다.”
드미트리의 낮은 목소리에 연구실의 모두가 그를 주목했다.
“생각해 보십시오. WebGL의 가장 큰 골칫거리 중 하나는 ‘상태(state)’였습니다. 그림 하나를 그리기 위해 수십 개의 스위치를 켜고 끄는 것과 같았죠. 블렌딩을 켜고, 뎁스 테스트를 켜고, 특정 셰이더 프로그램을 사용하고… 그리기가 끝나면 다음 객체를 위해 이 스위치들을 다시 재설정해야 합니다. 하나라도 잊어버리면 화면은 엉망이 되죠.”
그는 잠시 말을 멈추고 팀원들의 얼굴을 하나하나 뜯어보았다. 모두가 고개를 끄덕이고 있었다. WebGL 디버깅 시간의 절반은 ‘어떤 상태를 끄는 걸 깜빡했는가’를 찾는 데 허비된다는 건 공공연한 농담이었다.
“더 큰 문제는 성능입니다. CPU는 매번 그리기 명령을 내릴 때마다 이 모든 상태의 조합이 유효한지 드라이버에게 확인받아야 합니다. 드라이버는 그제야 GPU가 이해할 수 있는 코드로 번역하죠. 이 과정이 바로 CPU를 병들게 하는 주범입니다.”
드미트리가 물음표를 지우고 새로운 단어를 적기 시작했다.
‘Pipeline(파이프라인)’
“우리는 상태를 실시간으로 바꾸지 않을 겁니다. 대신, 렌더링에 필요한 모든 상태를 하나의 묶음으로 정의해서 ‘파이프라인’이라는 불변 객체로 구워버릴 겁니다.”
그는 파이프라인이라는 단어 아래에 세부 항목들을 나열했다.
- Vertex Shader / Fragment Shader (어떤 로직으로 정점과 픽셀을 처리할 것인가)
- Vertex Buffer Layout (입력되는 정점 데이터의 구조는 어떠한가)
- Primitive Topology (점, 선, 삼각형 중 무엇을 그릴 것인가)
- Depth/Stencil State (깊이와 스텐실 버퍼를 어떻게 다룰 것인가)
- Blend State (색상을 어떻게 혼합할 것인가)
“이 모든 것을 ‘렌더 파이프라인’이라는 하나의 청사진으로 미리 만들어두는 겁니다. 그리고 이 청사진은 한번 만들어지면 절대 바뀌지 않습니다.”
연구실에 정적이 감돌았다. 팀원들은 이 개념이 가진 파괴적인 힘을 서서히 깨닫고 있었다.
카이가 눈을 빛내며 말했다.
“그렇다면… 드라이버는 파이프라인이 생성되는 시점에 단 한 번만 모든 상태의 유효성을 검사하고 최적화할 수 있겠군요. 그리기 명령을 내릴 때는 이미 검증된 파이프라인을 사용하기만 하면 되니, CPU의 부담이 거의 사라지는 겁니다.”
“정확합니다.”
드미트리가 화이트보드를 톡톡 쳤다.
“이제 우리의 Command Encoder가 할 일은 훨씬 간단해집니다. encoder.setPipeline(myTrianglePipeline)
그리고 encoder.draw(3)
. 이게 전부입니다. 수십 개의 함수 호출이 단 두 개로 줄어드는 거죠.”
이것은 단순한 최적화를 넘어선 패러다임의 전환이었다. 동적인 상태 설정을 버리고, 사전에 정의된 불변의 객체를 사용하는 방식. 이는 개발자의 실수를 줄여줄 뿐만 아니라, 하드웨어가 최고의 성능을 낼 수 있도록 길을 터주는 혁신이었다.
NXT 프로젝트의 두 번째 거대한 기둥이 세워지는 순간이었다. ‘상태 기계’라는 낡은 유산을 역사의 뒤안길로 보내고, ‘파이프라인’이라는 견고하고 예측 가능한 반석 위에 새로운 시대를 열 준비를 마친 것이다.
하지만 드미트리는 알고 있었다. 가장 중요한 질문이 아직 남아있다는 것을.
‘이 위대한 파이프라인 안에서 실제로 동작할 심장, 즉 셰이더는 어떤 언어로 작성해야 하는가?’
그 질문은 또 다른 거대한 논쟁의 시작을 예고하고 있었다.