이 챕터에서 정복할 CG 개념
- POP(Point Operator)이 GPU 그래픽스 파이프라인의 데이터 모델을 노드 그래프로 노출시킨다는 명제의 윤곽.
- attribute / point / vertex / primitive / dispatch / multi-pass — 이 책에서 손으로 다룰 컴퓨터 그래픽스의 핵심 추상화 목록.
- 본 핸드북의 학습 구조와 다른 그래픽스 자료(LearnOpenGL, Real-Time Rendering, The Book of Shaders, GPU Gems)와의 관계.
왜 이게 중요한가
GPU 그래픽스를 공부할 때 가장 큰 장벽은 데이터 모델이다. vertex buffer, index buffer, SSBO(Shader Storage Buffer Object), uniform — 이 단어들은 모두 "GPU 메모리에 어떤 모양으로 데이터를 올려두고 어떤 단위로 끄집어내 셰이더에 먹일 것인가"에 대한 답이다. fragment shader 코드를 읽을 수 있어도, 그 셰이더에 들어가는 데이터가 어디서 어떻게 만들어졌는지가 안 보이면 파이프라인의 절반은 여전히 블랙박스다. POP은 그 절반을 노드로 꺼내 보여준다. 점 하나하나, 어트리뷰트 하나하나가 노드 그래프 위에서 만들어지고 변형되고 GPU 위에 머무른다. 학습자는 셰이더 위쪽 절반의 데이터 흐름을 손으로 조립한 뒤, 그 데이터가 라스터화에 어떻게 흘러드는지 확인할 수 있다.
POP에서의 노출 지점
POP은 2025년 10월 출시된 신생 오퍼레이터 패밀리다. Derivative 위키의 분류상으로는 Generator와 Filter 두 부류뿐이지만, 실제 인벤토리는 104개의 오퍼레이터로 구성된다. 이 책이 다룰 노출 지점은 다음과 같다.
- Sphere POP, Box POP, Grid POP 같은 Generator POP — vertex buffer가 어떻게 채워지는가.
- Attribute POP, Attribute Convert POP — attribute의 클래스(point / vertex / primitive)와 그 변환.
- Normal POP, Facet POP, Topology POP — flat shading과 smooth shading의 분기점이 GPU 메모리 레이아웃 결정으로 환원되는 자리.
- Transform POP — vertex shader의 MVP(Model-View-Projection) 곱셈을 노드로 노출.
- TOP to POP, POP to TOP, CHOP to POP — 텍스처/버퍼/CHOP 채널이 같은 GPU 메모리의 서로 다른 해석임을 보여주는 다리.
- GLSL POP, GLSL Advanced POP — compute shader를 직접 쓰는 자리. attribute SSBO에 그대로 읽고 쓰는 가장 작은 GPU 프로그램.
- Feedback POP, Particle POP — 이전 프레임의 상태가 다음 프레임으로 흐르는 ping-pong 패턴.
이론
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부터는 매 챕터가 다음 형식의 노드 구성을 요구한다.
시작 파일
- Sphere POP1 (Geodesic)
- Render Simple TOP1 연결: Sphere POP1 → Render Simple TOP1
이 두 노드만으로 화면에 회색 구가 뜬다. 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로 묶인다.
- Part I — Foundations (Ch.1–3): GPU의 데이터 모델. attribute, point/vertex/primitive 분리, custom attribute 설계.
- Part II — Data Flow on GPU (Ch.4–6): TOP↔︎POP↔︎CHOP 다리, 좌표계와 4×4 변환 행렬.
- Part III — Compute Shader 입문 (Ch.7–10): dispatch 모델, 첫 GLSL POP, noise와 displacement, 입자 시뮬레이션.
- Part IV — Multi-pass & Stateful GPU (Ch.11–13): feedback과 ping-pong, GLSL Advanced POP의 multi-pass, 이웃 연산과 spatial hash.
- Part V — Rendering Pipeline의 재조명 (Ch.14–16): POP attribute가 화면에 그려지기까지, instancing, instancing의 응용과 한계.
- Part VI — 통합과 확장 (Ch.17–18): 같은 추상화가 Unity / Niagara / WebGPU / Houdini VEX에서 어떻게 다시 나타나는가, 다음 학습 경로.
각 챕터는 동일한 구조를 따른다. "이 챕터에서 정복할 CG 개념" → "왜 이게 중요한가" → "POP에서의 노출 지점" → "이론" → "손작업" → "노드 ↔︎ GLSL 매핑" → "확인 질문" → "연결 고리" → "한 줄 명제". 각 챕터의 마지막 줄은 그 챕터의 핵심을 한 문장으로 압축한 명제다.
본문의 손작업은 모두 TouchDesigner 2025.31550을 기준으로 작성됐다. 위키에서 미확정인 동작은 본문에 "wiki 미확정 — 실험 필요"로 명시한다.
전제 지식
이 책은 다음을 가정한다.
- TouchDesigner 중상급 사용. TOP, CHOP, COMP 네트워크를 자유롭게 다룸.
- GLSL fragment shader를 읽고 쓸 수 있음.
gl_FragCoord,texture(), swizzling,mix,smoothstep수준의 문법이 익숙함. - 선형대수 기초: vec3 / mat4 / 행렬-벡터 곱.
- compute shader는 처음이어도 됨. Ch.7이 dispatch / workgroup / thread 모델을 처음부터 짚는다.
다음은 가정하지 않는다.
- Houdini SOP / POP 경험. Ch.3에서 Houdini의 attribute 모델을 정신적 선조로 한 번 언급하지만, 그 외에는 비교 차원에서만 등장한다.
- C++ 또는 OpenGL 직접 호출 경험.
이 핸드북이 시중에 없는 이유
POP은 2025년 10월에 출시된 신생 패밀리다. 이 시점에 시중에 존재하는 POP 자료는 두 부류다. 첫째는 Derivative 공식 위키 — 노드별 레퍼런스이지만 학습 자료가 아니다. 둘째는 "SOP를 POP으로 갈아타기" 또는 비주얼 효과 데모 위주의 짧은 영상 — POP의 표면 사용법은 보여주지만 GPU 그래픽스 데이터 모델을 가르치지 않는다.
이 책은 그 빈자리를 노린다. POP은 SOP의 빠른 버전으로도 쓸 수 있지만, 그건 이 도구의 본업이 아니다. 본업은 GPU의 데이터 모델을 노드 그래프로 노출시키는 일이다. 그 노출을 학습의 발판으로 삼는 자료가 영어권에도 한국어권에도 아직 없다.
다른 자료와의 관계
이 책은 LearnOpenGL, Real-Time Rendering 4ed, The Book of Shaders, GPU Gems의 보완재가 아니다. 진입로다.
- LearnOpenGL은 raster pipeline을 OpenGL API의 호출 순서로 가르친다. vertex buffer를 만들고, vertex array object에 묶고, shader 프로그램을 컴파일하고,
glDrawElements를 호출한다. 이 책은 그 호출들을 직접 부르지 않는 대신, 그 호출이 결국 무엇을 하고 있는지를 POP의 노드 그래프로 보여준다. Ch.2의 indexed rendering은 LearnOpenGL "Hello Triangle"의 Element Buffer Objects 섹션과 일대일 대응이다. - Real-Time Rendering 4ed는 그래픽스 파이프라인의 정전(canon)이다. 이 책의 모든 챕터는 RTR4의 어느 장과 직접 매핑되는지 "연결 고리" 섹션에 적는다. 책 한 권을 끝낸 학습자가 RTR4 §3 "The Graphics Processing Unit"을 다시 펴면, 모든 단어가 손에 잡힌다.
- The Book of Shaders는 fragment shader의 사고법을 가르친다. Ch.9의 noise는 이 책의 동일한 noise 함수가 compute POP에서는 점을 움직이고 fragment shader에서는 픽셀을 칠한다는 사실을 보여주는 자리다.
- GPU Gems 시리즈는 사례 모음이다. Ch.11(fluid), Ch.13(boids), Ch.15(instancing)의 연결 고리에 자주 등장한다.
이 책을 읽은 뒤 위 자료들로 넘어가는 것이 자연스러운 경로다. 이 책 자체는 그 자료들을 대체하지 않는다.
확인 질문 (Self-check)
- POP의 Point / Vertex / Primitive 분리는 GPU 메모리의 어떤 두 버퍼 구조를 반영하는가?
- SOP의 동작 모델과 POP의 동작 모델이 다른 한 가지 결정적 지점은 무엇인가?
TDIndex()가 정의되지 않는 dispatch 모드는 어느 모드인가?- 이 책이 LearnOpenGL을 대체하지 않고 진입로 역할을 한다고 말하는 이유는 무엇인가?
연결 고리
- TouchDesigner Wiki — "POP" (https://docs.derivative.ca/POP). POP 패밀리 개요.
- TouchDesigner Wiki — "Points, Vertices and Primitives in POPs". 클래스 분리에 대한 위키 개념 페이지.
- Real-Time Rendering 4ed Ch.3 "The Graphics Processing Unit". GPU-native 데이터 모델이 왜 중요한가의 책 측 정전.
- LearnOpenGL — "Hello Triangle" (https://learnopengl.com/Getting-started/Hello-Triangle). API 호출 순서로 보는 같은 데이터 모델.
이 챕터의 한 줄 명제
POP은 SOP의 GPU판이 아니라 GPU 그래픽스 파이프라인의 데이터 모델을 노드 그래프로 노출시킨 학습 환경이며, 이 책은 그 노출을 발판 삼아 컴퓨터 그래픽스의 핵심 추상화를 손으로 익히는 진입로다.