The same C++ rendering and filtering pipeline that ships in desktop VTK, compiled to WebAssembly and drawn with WebGL/WebGPU. No server-side rendering, no pixel streaming, no rewrite.
<script
src="https://unpkg.com/@kitware/vtk-wasm/vtk-umd.js"
id="vtk-wasm"
data-url="https://raw.githack.com/Kitware/vtk-wasm/dist/latest/vtk-wasm32-emscripten.tar.gz"
></script>
<canvas id="vtk-wasm-window" tabindex="-1"></canvas>
<script>
vtkwasm.ready.then((vtk) => buildScene(vtk, "#vtk-wasm-window"));
</script>Each path ends at the same WASM module. Start where your codebase already is.
import { loadAsync } from "@kitware/vtk-wasm";
const runtime = await loadAsync({
url: "https://raw.githack.com/Kitware/vtk-wasm/dist/latest/vtk-wasm32-emscripten.tar.gz",
rendering: "webgl", // or "webgpu"
});
const session = runtime.createStandaloneSession();
const vtk = session.vtk;
const cone = vtk.vtkConeSource();
const mapper = vtk.vtkPolyDataMapper();
await mapper.SetInputConnection(await cone.GetOutputPort());
const actor = vtk.vtkActor({ mapper });
const renderer = vtk.vtkRenderer();
await renderer.addActor(actor);
const interactor = vtk.vtkRenderWindowInteractor({ canvasSelector });
const canvasSelector = session.registerCanvas("!vtk-canvas", canvas);
const window = vtk.vtkRenderWindow({ interactor, canvasSelector });
await window.addRenderer(renderer);
await window.render();
await interactor.start();