GPU sculpting, anywhere. One C++17 codebase; sculpts natively on WebGPU or OpenGL, and in your browser with nothing to install.
▶ Sculpt now: tpn.itch.io/chisel-sculpt — needs a WebGPU browser (Chrome/Edge 113+, or Firefox/Safari with the flag on).
Chisel runs the entire sculpt pipeline on the GPU: brushes, normals, masking, selection, remeshing, and voxel merging all execute as compute shaders. The CPU orchestrates; the GPU does the work. It is spartan by design — no menus to dig through, every control a keystroke or a hold-and-drag — because the two things that matter are raw speed at high polygon counts and never interrupting the artist.
Project files are cross-platform: a .chisel saved in the browser opens
identically in the native build, and vice versa.
- Nine brushes — draw, clay, inflate, crease, pinch, move, limb (snakehook), smooth, mask
- Vertex paint mode with colour picking; paint survives subdivision, remeshing, and merges
- Multiple objects — insert, select, move, scale, delete; per-object undo and subdivision
- Multires displacement stack — step down to edit forms, back up for detail
- X-axis mirror — real-time symmetric sculpting, masking, and painting
- Voxel merge — weld a selection into one watertight manifold, ready for 3D printing; mirror-symmetric or boolean-subtract variants, Marching Cubes or Surface Nets
- Isotropic remesh — respects masks and mirror symmetry
- Delta-based undo/redo — per-stroke, per-object, GPU-resident
- OBJ / PLY in; OBJ / STL / PLY out (PLY carries vertex paint)
- Pen pressure — XInput2 / WinTab / browser Pointer Events; mouse-first design, tablet optional
- Matcap shading — one draw call per object
Full controls and workflow: MANUAL.md. Quickstart: left-drag on the
mesh sculpts, off the mesh orbits; 1–4 switch modes; hold S/W/A + drag to tune
the brush; X mirrors; Ctrl+Z undoes.
The mesh stays GPU-resident. A render-target snapshot at pen-down gives the CPU screen-space depth/normal/triangle-ID buffers to pick against, so a stroke runs with zero GPU sync until pen-up. Mesh data is flat SOA arrays with CSR adjacency — no half-edges, no linked lists. Normals recompute partially (dirty vertices only), GPU uploads are partial, and the brush hot path allocates nothing.
The GPU layer is a thin seam with two backends: WebGPU (WGSL kernels — wgpu-native on desktop, the browser's own WebGPU via Emscripten on the web) and OpenGL 4.3 compute (GLSL kernels) as the reference/fallback path. Every kernel exists in lockstep WGSL + GLSL; the same application code drives both.
Dependencies (native): libglfw3-dev, libgl-dev, libglx-dev, libegl-dev, CMake.
# Native, WebGPU backend (wgpu-native, fetched automatically)
cmake -B build-wgpu -DCHISEL_GPU_BACKEND=webgpu && cmake --build build-wgpu -j$(nproc)
./build-wgpu/chisel
# Native, OpenGL 4.3 backend
cmake -B build-gl -DCHISEL_GPU_BACKEND=gl && cmake --build build-gl -j$(nproc)
./build-gl/chisel
# Browser (Emscripten ≥ 4.0.10 with the emdawnwebgpu port)
source ~/emsdk/emsdk_env.sh
emcmake cmake -B build-web -DCHISEL_GPU_BACKEND=webgpu && cmake --build build-web -j$(nproc)
# serve build-web/ over HTTP and open chisel.htmlCI builds a Linux AppImage and a Windows zip on every tagged release.
chisel [file] [flags]
file— a.chiselproject or.objmodel to open on launch.--max-level=N— raise the subdivision cap (default 9, max 12). Levels past 9 get heavy on the CPU (level switches, merge, remesh roughly 4x per level); the GPU-limit guard still refuses what your card can't hold.--mirror=spatial— use the spatial-hash mirror pairing instead of the topology map.--toaster— shrink the undo history budgets for low-memory machines.--ring-mb=N— debug: cap the GPU undo ring at N MB.
Chisel was vibecoded with Anthropic's Claude.
MIT License. See LICENSE for details.
