강의 구성
각 레슨은 Markdown 문서와 독립 실행 데모로 구성합니다. ../css-matrix가 CSS/DOM/SVG 중심으로 Figma-like 에디터의 수학과 상태 모델을 설명했다면, 이 강의는 같은 편집기 문제를 Canvas, WebGL, WebGPU 중심으로 다시 구성합니다.
이 강의의 독자는 CSS position, transform, z-index, SVG, DOM 이벤트에는 익숙하지만 GPU 렌더링은 처음인 사람입니다. 따라서 shader나 pipeline을 먼저 설명하지 않습니다. 먼저 “DOM으로 공짜로 받던 것이 Canvas에서 왜 사라지는가”를 보여주고, 그 빈자리를 scene graph, matrix, hit testing, renderer abstraction으로 채웁니다.
최종 목표는 WebGL/WebGPU API를 외우는 것이 아니라 다음 구조를 직접 만드는 것입니다.
editor state
-> scene graph
-> camera / matrix
-> WebGL renderer
-> editor tools
-> WebGPU renderer
Part 0. CSS에서 GPU로 사고 전환
- 001. CSS 박스가 사라지면 무엇이 남는가
- 002. Canvas는 DOM이 아니라 픽셀 버퍼다
- 003. CSS pixel, device pixel, backing store
- 004. scene model과 renderer 분리하기
- 005. retained mode vs immediate mode
- 006. DOM event target 없이 hit testing 하기
Part 1. Canvas editor의 기본 뼈대
- 007. render loop와 frame lifecycle
- 008. viewport와 camera
- 009. screen/world/local 좌표계 복습
- 010. cursor anchored zoom
- 011. grid와 ruler를 canvas에 그리기
- 012. overlay layer와 control layer 분리
Part 2. WebGL 2D renderer
- 013. WebGL context와 첫 triangle
- 014. clip space와 화면 좌표
- 015. shader를 CSS transform 관점으로 읽기
- 016. rectangle을 두 triangle로 그리기
- 017. matrix uniform으로 camera 적용하기
- 018. 색상, alpha, blending
- 019. 여러 rectangle을 buffer에 담기
- 020. batching과 draw call 줄이기
- 021. instanced rectangle renderer
- 022. line/outline renderer
Part 3. Editor tool math
- 023. pointer 좌표를 world 좌표로 바꾸기
- 024. CPU hit testing
- 025. selection bounds
- 026. hover outline
- 027. move tool
- 028. resize handles
- 029. rotation handle
- 030. marquee selection
- 031. snapping과 smart guides
- 032. group transform
Part 4. Figma-like scene graph
- 033. node tree 설계
- 034. transform inheritance
- 035. layer order와 z sorting
- 036. frame과 clipping
- 037. fill, stroke, effect 모델
- 038. command model과 undo/redo
- 039. JSON export/import
- 040. renderer-independent editor core
Part 5. Image, text, vector
- 041. texture로 image node 그리기
- 042. texture atlas 기본
- 043. text rendering 전략
- 044. SVG/text를 GPU editor에서 다루는 경계
- 045. vector path는 어디까지 직접 구현할 것인가
Part 6. WebGPU로 옮기기
- 046. WebGPU adapter/device/context
- 047. WGSL과 render pipeline
- 048. WebGL renderer를 WebGPU renderer로 바꾸기
- 049. uniform buffer와 bind group
- 050. WebGPU instancing
- 051. WebGL/WebGPU fallback 전략
Part 7. Capstone
- 052. editor shell 만들기
- 053. toolbar / layer panel / inspector 연결
- 054. mini Figma-like editor 완성
- 055. 성능 점검과 디버깅
- 056. 배포와 브라우저 호환성 체크
Part 8. Three.js로 WebGL 개발하기
- 057. Three.js를 WebGL renderer로 쓰는 기준
- 058. Scene, Camera, Renderer, render loop
- 059. OrthographicCamera로 2D editor 좌표계 만들기
- 060. BufferGeometry, Material, ShaderMaterial
- 061. Raycaster와 editor picking
- 062. Three.js renderer를 editor core 뒤에 붙이기
- 063. Three.js 프로젝트 세팅과 renderer lifecycle
- 064. Object3D transform과 editor scene graph 매핑
- 065. InstancedMesh로 많은 rectangle 그리기
- 066. Texture, CanvasTexture, Sprite로 이미지/텍스트 다루기
- 067. Three.js에서 outline, selection, overlay 만들기
- 068. dispose, cache, renderer.info로 성능 관리하기
- 069. WebGPURenderer와 TSL로 넘어가는 길
- 070. RenderTarget을 이용한 picking buffer
- 071. Three.js를 쓰면 안 좋은 경우
Appendix A. GPU editor debugging
- 072. WebGL/WebGPU 디버그 overlay 만들기
- 073. 좌표계, matrix, bounds readout 설계
- 074. frame time, draw call, buffer upload 측정하기
- 075. Spector.js / Chrome DevTools로 WebGL 프레임 보기
Appendix B. Browser and GPU compatibility
- 076. WebGL/WebGPU feature detection 체크리스트
- 077. DPR, resize, context lost 처리
- 078. Safari/Chrome/Firefox 차이와 fallback 정책
- 079. GPU memory와 texture size 제한
Appendix C. Asset pipeline
- 080. 이미지 로딩, ImageBitmap, texture upload
- 081. SVG를 texture로 쓸지 vector로 유지할지
- 082. 폰트 로딩과 text metrics
- 083. export용 PNG/SVG/JSON 생성 전략
Appendix D. Interaction polish and motion
- 084. inertial pan과 smooth zoom
- 085. snapping feedback animation
- 086. selection/hover transition
- 087. timeline 없이 필요한 최소 모션 수학
Appendix E. Production architecture
- 088. renderer worker / OffscreenCanvas를 고려하는 기준
- 089. document model versioning과 migration
- 090. plugin architecture와 command API
- 091. test 가능한 renderer abstraction 만들기
Appendix F. 2D renderer engine patterns
- 092. renderable type 선택: shape, sprite, mesh
- 093. static subtree를 texture cache로 굽기
- 094. render layer와 render group 설계
- 095. viewport culling과 spatial index
- 096. clipping 구현: scissor, stencil, mask texture
- 097. filters와 blend modes가 batch를 깨는 이유
- 098. interactivity budget: pickable, hitArea, skip children
- 099. texture GC와 idle resource eviction
- 100. dynamic text update 비용과 bitmap/glyph 전략
- 101. Canvas/WebGL editor의 accessibility layer
Appendix G. Rendering editor production gaps
- 102. render invalidation과 dirty flag
- 103. color space, premultiplied alpha, export 색상
- 104. stroke join/cap/dash/fill rule
- 105. editable text: DOM overlay, IME, caret, metrics
- 106. tool state machine과 pointer capture
- 107. pixel test와 renderer regression test
강의의 기준선
이 강의는 처음부터 WebGPU만 사용하지 않습니다. WebGL로 안정적인 2D renderer를 먼저 만들고, 같은 scene model 뒤에 WebGPU renderer를 붙입니다.
editor state
-> scene model
-> WebGL renderer
-> WebGPU renderer
이 구조를 지키면 WebGPU를 배우는 동안에도 편집기 수학과 상태 모델은 흔들리지 않습니다. 렌더러는 바뀌지만 사용자가 도형을 선택하고, 움직이고, 저장하는 방식은 그대로 남습니다.