01

Part 0 · 시작 Chapter 01 of 18 Build 2025.31550

왜 POP인가

“POP은 SOP의 빠른 버전이 아니라 GPU 그래픽스 파이프라인의 데이터 모델을 직접 손에 쥐어주는 학습 환경이다.”

이 챕터에서 정복할 CG 개념

왜 이게 중요한가

GPU 그래픽스를 공부할 때 가장 큰 장벽은 데이터 모델이다. vertex buffer, index buffer, SSBO(Shader Storage Buffer Object), uniform — 이 단어들은 모두 "GPU 메모리에 어떤 모양으로 데이터를 올려두고 어떤 단위로 끄집어내 셰이더에 먹일 것인가"에 대한 답이다. fragment shader 코드를 읽을 수 있어도, 그 셰이더에 들어가는 데이터가 어디서 어떻게 만들어졌는지가 안 보이면 파이프라인의 절반은 여전히 블랙박스다. POP은 그 절반을 노드로 꺼내 보여준다. 점 하나하나, 어트리뷰트 하나하나가 노드 그래프 위에서 만들어지고 변형되고 GPU 위에 머무른다. 학습자는 셰이더 위쪽 절반의 데이터 흐름을 손으로 조립한 뒤, 그 데이터가 라스터화에 어떻게 흘러드는지 확인할 수 있다.

POP에서의 노출 지점

POP은 2025년 10월 출시된 신생 오퍼레이터 패밀리다. Derivative 위키의 분류상으로는 Generator와 Filter 두 부류뿐이지만, 실제 인벤토리는 104개의 오퍼레이터로 구성된다. 이 책이 다룰 노출 지점은 다음과 같다.

이론

POP을 SOP의 GPU판으로 받아들이면 이 책의 입구가 막힌다. SOP는 CPU 위의 mesh 편집기다. POP은 GPU 위의 attribute 컨테이너다. 두 개념은 출력 모양이 닮았을 뿐, 동작 모델이 다르다.

GPU 위의 mesh는 두 개의 버퍼로 표상된다. 하나는 point buffer로, 점의 위치 P와 그 외 per-point attribute를 일렬로 담는다. 다른 하나는 index buffer로, 어떤 점 인덱스 세 개가 한 삼각형을 이루는지를 적는다. POP의 Point / Vertex / Primitive라는 세 가지 attribute 클래스는 이 두 버퍼 구조의 직접 반영이다. Point class는 point buffer의 각 행에 붙고, Primitive class는 인덱스 묶음 단위에 붙고, Vertex class는 "어떤 primitive의 몇 번째 corner인가"라는 per-corner 슬롯에 붙는다. 이 구분은 어떤 노드를 어디에 놓느냐가 아니라 데이터가 어느 버퍼에 살 것인가의 결정이다.

GPU 프로그램은 이 두 버퍼를 두 가지 방식으로 소비한다. 첫째는 라스터 파이프라인: vertex shader가 point buffer를 한 번에 한 점씩 읽어 변환하고, primitive assembly가 index buffer를 따라 삼각형을 모으고, 라스터라이저가 그 삼각형을 픽셀로 쪼개 fragment shader에 넘긴다. 둘째는 compute 파이프라인: compute shader가 동일한 버퍼를 thread 단위로 병렬 처리한다. 이 두 길이 같은 메모리 위에서 만난다. POP은 그 메모리를 노드 그래프로 꺼내 보여주고, GLSL POP은 그 메모리에 compute shader로 직접 쓴다.

이 책은 POP을 그 매개로 사용한다. POP 그 자체가 학습 목표가 아니다.

손작업 (Hands-on)

이 챕터는 메타 챕터이므로 손작업은 책 전체의 손작업 흐름을 짧게 예고하는 데 그친다. Ch.2부터는 매 챕터가 다음 형식의 노드 구성을 요구한다.

시작 파일

이 두 노드만으로 화면에 회색 구가 뜬다. POP을 처음 다루는 단계에서 확인해야 할 것은 단 하나, Sphere POP의 Info 패널에서 점 수, 정점 수, 프리미티브 수가 각각 다른 값으로 표시된다는 사실이다. SOP에서는 "점 = 정점"이 흔했지만 POP에서는 둘이 명시적으로 분리된다. 이 분리가 Ch.2의 전제다.

노드 ↔︎ GLSL 매핑

이 책의 모든 본격 챕터는 동일한 결과를 두 번 구현한다. 한 번은 노드 그래프로, 한 번은 GLSL POP 또는 GLSL Advanced POP의 compute shader로. 매핑의 가장 작은 사례는 다음이다.

// GLSL POP, Attribute Class = Point, Output Attributes = P
void main() {
    const uint id = TDIndex();
    if (id >= TDNumElements()) return;

    P[id] = TDIn_P();
}

이 코드는 GPU 위에서 정확히 다음 일을 한다. TDIndex()로 현재 thread의 1차원 인덱스를 받고, TDNumElements()보다 큰 인덱스(workgroup 크기로 올림된 잉여 thread)는 즉시 반환해 SSBO 범위 밖 쓰기를 막는다. 그 다음 입력 0번 POP의 P attribute를 같은 인덱스에서 읽어 출력 P attribute의 같은 슬롯에 쓴다. 입력을 무변형 복사하는 가장 작은 compute shader다. if (id >= TDNumElements()) return; 관용구는 이 책의 모든 GLSL POP 코드 블록에서 반복된다. workgroup 크기가 NVIDIA는 32, AMD는 64로 라운드업되기 때문에 필수다.

노드 측의 대응은 단순히 Sphere POP의 출력을 다른 POP 입력에 그대로 연결한 경우다. 두 구현은 같은 결과를 낸다. 차이는 학습자에게 "GPU가 이 동작을 어떻게 표현하는가"를 한 번 더 보여주는 데 있다.

이 책을 읽는 법

이 책은 18챕터로 구성되며 여섯 개의 Part로 묶인다.

각 챕터는 동일한 구조를 따른다. "이 챕터에서 정복할 CG 개념" → "왜 이게 중요한가" → "POP에서의 노출 지점" → "이론" → "손작업" → "노드 ↔︎ GLSL 매핑" → "확인 질문" → "연결 고리" → "한 줄 명제". 각 챕터의 마지막 줄은 그 챕터의 핵심을 한 문장으로 압축한 명제다.

본문의 손작업은 모두 TouchDesigner 2025.31550을 기준으로 작성됐다. 위키에서 미확정인 동작은 본문에 "wiki 미확정 — 실험 필요"로 명시한다.

전제 지식

이 책은 다음을 가정한다.

다음은 가정하지 않는다.

이 핸드북이 시중에 없는 이유

POP은 2025년 10월에 출시된 신생 패밀리다. 이 시점에 시중에 존재하는 POP 자료는 두 부류다. 첫째는 Derivative 공식 위키 — 노드별 레퍼런스이지만 학습 자료가 아니다. 둘째는 "SOP를 POP으로 갈아타기" 또는 비주얼 효과 데모 위주의 짧은 영상 — POP의 표면 사용법은 보여주지만 GPU 그래픽스 데이터 모델을 가르치지 않는다.

이 책은 그 빈자리를 노린다. POP은 SOP의 빠른 버전으로도 쓸 수 있지만, 그건 이 도구의 본업이 아니다. 본업은 GPU의 데이터 모델을 노드 그래프로 노출시키는 일이다. 그 노출을 학습의 발판으로 삼는 자료가 영어권에도 한국어권에도 아직 없다.

다른 자료와의 관계

이 책은 LearnOpenGL, Real-Time Rendering 4ed, The Book of Shaders, GPU Gems의 보완재가 아니다. 진입로다.

이 책을 읽은 뒤 위 자료들로 넘어가는 것이 자연스러운 경로다. 이 책 자체는 그 자료들을 대체하지 않는다.

확인 질문 (Self-check)

  1. POP의 Point / Vertex / Primitive 분리는 GPU 메모리의 어떤 두 버퍼 구조를 반영하는가?
  2. SOP의 동작 모델과 POP의 동작 모델이 다른 한 가지 결정적 지점은 무엇인가?
  3. TDIndex()가 정의되지 않는 dispatch 모드는 어느 모드인가?
  4. 이 책이 LearnOpenGL을 대체하지 않고 진입로 역할을 한다고 말하는 이유는 무엇인가?

연결 고리

이 챕터의 한 줄 명제

POP은 SOP의 GPU판이 아니라 GPU 그래픽스 파이프라인의 데이터 모델을 노드 그래프로 노출시킨 학습 환경이며, 이 책은 그 노출을 발판 삼아 컴퓨터 그래픽스의 핵심 추상화를 손으로 익히는 진입로다.