CSS 개발자를 위한 GPU 2D 에디터 만들기
Guide
CSS Matrix
Guide
CSS Matrix
  • Part 0. CSS에서 GPU로 사고 전환

    • CSS 박스가 사라지면 무엇이 남는가
    • Canvas는 DOM이 아니라 픽셀 버퍼다
    • CSS pixel, device pixel, backing store
    • scene model과 renderer 분리하기
    • retained mode vs immediate mode
    • DOM event target 없이 hit testing 하기
  • Part 1. Canvas editor의 기본 뼈대

    • render loop와 frame lifecycle
    • viewport와 camera
    • screen/world/local 좌표계 복습
    • cursor anchored zoom
    • grid와 ruler를 canvas에 그리기
    • overlay layer와 control layer 분리
  • Part 2. WebGL 2D renderer

    • WebGL context와 첫 triangle
    • clip space와 화면 좌표
    • shader를 CSS transform 관점으로 읽기
    • rectangle을 두 triangle로 그리기
    • matrix uniform으로 camera 적용하기
    • 색상, alpha, blending
    • 여러 rectangle을 buffer에 담기
    • batching과 draw call 줄이기
    • instanced rectangle renderer
    • line/outline renderer
  • Part 3. Editor tool math

    • pointer 좌표를 world 좌표로 바꾸기
    • CPU hit testing
    • selection bounds
    • hover outline
    • move tool
    • resize handles
    • rotation handle
    • marquee selection
    • snapping과 smart guides
    • group transform
  • Part 4. Figma-like scene graph

    • node tree 설계
    • transform inheritance
    • layer order와 z sorting
    • frame과 clipping
    • fill, stroke, effect 모델
    • command model과 undo/redo
    • JSON export/import
    • renderer-independent editor core
  • Part 5. Image, text, vector

    • texture로 image node 그리기
    • texture atlas 기본
    • text rendering 전략
    • SVG/text를 GPU editor에서 다루는 경계
    • vector path는 어디까지 직접 구현할 것인가
  • Part 6. WebGPU로 옮기기

    • WebGPU adapter/device/context
    • WGSL과 render pipeline
    • WebGL renderer를 WebGPU renderer로 바꾸기
    • uniform buffer와 bind group
    • WebGPU instancing
    • WebGL/WebGPU fallback 전략
  • Part 7. Capstone

    • editor shell 만들기
    • toolbar / layer panel / inspector 연결
    • mini Figma-like editor 완성
    • 성능 점검과 디버깅
    • 배포와 브라우저 호환성 체크
  • Part 8. Three.js로 WebGL 개발하기

    • Three.js를 WebGL renderer로 쓰는 기준
    • Scene, Camera, Renderer, render loop
    • OrthographicCamera로 2D editor 좌표계 만들기
    • BufferGeometry, Material, ShaderMaterial
    • Raycaster와 editor picking
    • Three.js renderer를 editor core 뒤에 붙이기
    • Three.js 프로젝트 세팅과 renderer lifecycle
    • Object3D transform과 editor scene graph 매핑
    • InstancedMesh로 많은 rectangle 그리기
    • Texture, CanvasTexture, Sprite로 이미지/텍스트 다루기
    • Three.js에서 outline, selection, overlay 만들기
    • dispose, cache, renderer.info로 성능 관리하기
    • WebGPURenderer와 TSL로 넘어가는 길
    • RenderTarget을 이용한 picking buffer
    • Three.js를 쓰면 안 좋은 경우
  • Appendix A. GPU editor debugging

    • WebGL/WebGPU 디버그 overlay 만들기
    • 좌표계, matrix, bounds readout 설계
    • frame time, draw call, buffer upload 측정하기
    • Spector.js / Chrome DevTools로 WebGL 프레임 보기
  • Appendix B. Browser and GPU compatibility

    • WebGL/WebGPU feature detection 체크리스트
    • DPR, resize, context lost 처리
    • Safari/Chrome/Firefox 차이와 fallback 정책
    • GPU memory와 texture size 제한
  • Appendix C. Asset pipeline

    • 이미지 로딩, ImageBitmap, texture upload
    • SVG를 texture로 쓸지 vector로 유지할지
    • 폰트 로딩과 text metrics
    • export용 PNG/SVG/JSON 생성 전략
  • Appendix D. Interaction polish and motion

    • inertial pan과 smooth zoom
    • snapping feedback animation
    • selection/hover transition
    • timeline 없이 필요한 최소 모션 수학
  • Appendix E. Production architecture

    • renderer worker / OffscreenCanvas를 고려하는 기준
    • document model versioning과 migration
    • plugin architecture와 command API
    • test 가능한 renderer abstraction 만들기
  • Appendix F. 2D renderer engine patterns

    • renderable type 선택: shape, sprite, mesh
    • static subtree를 texture cache로 굽기
    • render layer와 render group 설계
    • viewport culling과 spatial index
    • clipping 구현: scissor, stencil, mask texture
    • filters와 blend modes가 batch를 깨는 이유
    • interactivity budget: pickable, hitArea, skip children
    • texture GC와 idle resource eviction
    • dynamic text update 비용과 bitmap/glyph 전략
    • Canvas/WebGL editor의 accessibility layer
  • Appendix G. Rendering editor production gaps

    • render invalidation과 dirty flag
    • color space, premultiplied alpha, export 색상
    • stroke join/cap/dash/fill rule
    • editable text: DOM overlay, IME, caret, metrics
    • tool state machine과 pointer capture
    • pixel test와 renderer regression test

editor shell 만들기

이제 강의에서 만든 조각들을 하나의 앱 형태로 묶습니다. editor shell은 캔버스, toolbar, layer panel, inspector, status bar를 담는 바깥 구조입니다.

여기서 중요한 것은 UI를 예쁘게 배치하는 것보다 책임을 나누는 것입니다.

shell의 최소 HTML/CSS 구조

capstone에서는 먼저 renderer보다 바깥 shell을 고정합니다. canvas가 어디에 붙고, overlay와 panels가 어디에 붙는지 명확해야 합니다.

<main class="editor-shell">
  <header class="toolbar"></header>
  <aside class="tool-rail"></aside>
  <section class="canvas-pane">
    <canvas class="gpu-canvas"></canvas>
    <div class="dom-overlay"></div>
  </section>
  <aside class="inspector"></aside>
  <footer class="status-bar"></footer>
</main>
.editor-shell {
  height: 100vh;
  display: grid;
  grid-template:
    "toolbar toolbar toolbar" 48px
    "tools canvas inspector" 1fr
    "status status status" 28px /
    56px 1fr 280px;
}

.canvas-pane {
  position: relative;
  overflow: hidden;
}

.gpu-canvas,
.dom-overlay {
  position: absolute;
  inset: 0;
}

dom-overlay는 text editing이나 accessibility proxy처럼 브라우저 레이어가 필요한 기능을 올리는 곳입니다.

capstone 파일 구조를 먼저 고정한다

작은 editor라도 책임을 나누지 않으면 tool, renderer, UI가 서로 직접 상태를 만지게 됩니다. capstone은 아래 모듈 구조로 조립합니다.

src/
  core/document.ts      scene document, node update, traversal
  core/commands.ts      command apply, undo, redo
  core/editor-core.ts   dispatch, snapshot, history
  tools/pointer.ts      clientToCanvas, screenToWorld
  tools/select-tool.ts  hover, hit test, marquee
  tools/transform.ts    move, resize, rotate, snapping
  renderer/webgl.ts     WebGL backend
  renderer/snapshot.ts  drawList, world matrix cache
  ui/panels.ts          toolbar, layer panel, inspector
  persistence/json.ts   export/import document

이 구조에서 core는 DOM과 WebGL을 import하지 않습니다. renderer와 UI가 core를 바라보는 방향만 허용합니다.

ui/tools -> core -> snapshot -> renderer

shell은 앱의 레이아웃이다

editor shell은 문서 모델을 직접 바꾸는 핵심 로직이 아닙니다. 사용자가 도구와 패널을 볼 수 있게 배치하는 앱 프레임입니다.

top toolbar
left tool rail
center canvas surface
right inspector
bottom status/readout

Canvas surface는 renderer와 input system이 붙는 중심 영역입니다.

shell은 editor core를 주입받는다

shell이 scene graph를 직접 소유하면 금방 엉킵니다. shell은 editor core의 상태를 읽고, 사용자 명령을 core에 전달합니다.

UI event
-> editor action
-> core updates state
-> renderer redraws
-> panels reflect state

이 흐름을 유지하면 UI를 바꿔도 core는 유지됩니다.

layout은 좌표계와 분리한다

toolbar와 inspector는 DOM layout입니다. 캔버스 안의 world/screen 좌표와 섞으면 안 됩니다.

app layout coordinates
canvas screen coordinates
document world coordinates

이 세 좌표계를 분리해두면 resize, panel collapse, fullscreen mode를 다루기 쉽습니다.

오늘의 핵심

editor shell은 편집기의 앱 구조입니다.

shell owns layout
core owns document state
renderer owns pixels

이 경계를 지키면 capstone을 작은 부품으로 조립할 수 있습니다.

최근 수정: 26. 5. 16. PM 12:53
Contributors: jinho.park.s3
Next
toolbar / layer panel / inspector 연결