One renderer owns the frame.
Scene collection, culling, sorting, instancing, shadows and post-processing stay backend-neutral.
Modern Web graphics engine
Build high-performance 2D and 3D experiences with a modern TypeScript graphics engine. Run the same scene on WebGPU and WebGL 2, customize every render pass, and stay in control from scene to screen.
npm install hilo3d
WebGPU · WebGL 2
PBR + glTF
Render Graph
WebGPU
WebGL 2
Live engine studies
Compose a renderable Entity and submit one extracted RenderWorld.
Load a glTF prefab and instantiate it directly into a World.
Put MeshRenderer, RigidBody, and Collider on the same Entity.
Rendering architecture
Scene processing, draw preparation, shadows, post-processing, and resource lifecycle stay in one shared frontend. Every frame is compiled through a validated Render Graph and executed through native WebGPU or WebGL 2 backends.
Scene collection, culling, sorting, instancing, shadows and post-processing stay backend-neutral.
Invalid dependencies stop before GPU work. Frame-local state commits only after a valid submission and rolls back on failure.
Resources, pipelines, bindings, commands and recovery cross the RHI while native access stays inside backend boundaries.
Production showcase
Hilo3D has powered character worlds, social games, and interactive 3D products at real consumer scale.
Character creation and an immersive personal 3D world.
A playful physics-driven stacking experience built for mobile.
A colorful isometric planet filled with interactive 3D spaces.
Start building
Create a World and Engine. Auto mode selects a compatible WebGPU adapter first and uses WebGL 2 when WebGPU is unavailable.
import * as Hilo3d from 'hilo3d';
const world = await Hilo3d.World.create({
systems: [
Hilo3d.createTransformSystem(),
Hilo3d.createRenderExtractionSystem()
]
});
const engine = await Hilo3d.Engine.create({
backend: 'auto',
container
});
const cube = world.createEntity();
world.add(cube, Hilo3d.LocalTransform, {});
world.add(cube, Hilo3d.MeshRenderer, {
geometry: new Hilo3d.BoxGeometry(),
material: new Hilo3d.PBRMaterial()
});
const camera = world.createEntity();
world.add(camera, Hilo3d.LocalTransform, { position: [0, 0, 5] });
world.add(camera, Hilo3d.PerspectiveCamera, { aspect: 16 / 9 });
world.add(camera, Hilo3d.CameraOutput, { enabled: true });
engine.frame(world, 0);
Open source · MIT