GitPedia

Ashes

WebGL2.0 3D Engine - Global Illumination - RayTracing

From but0n·Updated May 17, 2026·View on GitHub·

- Press `k` to toggle render mode - Press `q` and `e` to adjust aperture (depth of field) - Press `a` and `d` to focal length - Press `[` andd `]` to adjust exposure The project is written primarily in TypeScript, distributed under the MIT License license, first published in 2018. Key topics include: bvh, ecs, game-engine, global-illumination, gltf.

<h1 align="center"> <img src="https://user-images.githubusercontent.com/7625588/53308816-3041ec80-38df-11e9-9c3a-fb515eb4d404.png"> </h1>

image

Build Status

Dynamic GI


Ray Tracing demo

  • Press k to toggle render mode
  • Press q and e to adjust aperture (depth of field)
  • Press a and d to focal length
  • Press [ andd ] to adjust exposure

glTF Example


Examples

Features

ezgif-4-e4c6f3cb3183

  • Entity–component–system (ECS) architectural
  • glTF support
  • Physically based rendering (PBR)
  • Post effects (WIP)
  • Skeleton animation
  • Keyframe animation
  • HDR

Getting Started

  • via CDN
html
<script src="https://cdn.jsdelivr.net/npm/ashes3d/build/ashes.main.js"></script>
  • via npm
npm i ashes3d

Usage

Try it

js
let { Asset, EntityMgr, Camera, vec3, quat, Screen, OrbitControl, MeshRenderer, Filter, Shader, Material, QuadMesh } = Ashes; let CDN = 'https://but0n.github.io/Ashes/' Material.SHADER_PATH = CDN + Material.SHADER_PATH; // DamagedHelmet let gltf = CDN + 'gltfsamples/DamagedHelmet.glb'; async function main() { let screen = new Screen('#screen'); screen.bgColor = [0.2,0.2,0.2,1]; let skybox = await Asset.loadCubemap(CDN + 'res/envmap/GoldenGateBridge2/'); let scene = EntityMgr.create('root - (Click each bar which has yellow border to toggle visible)'); // Camera let mainCamera = EntityMgr.create('camera'); let cam = mainCamera.addComponent(new Camera(screen.width / screen.height)); // Set default position let cameraTrans = mainCamera.components.Transform; vec3.set(cameraTrans.translate, 0, 10, 10); // Add it to scene scene.appendChild(mainCamera); // Attach controler mainCamera.addComponent(new OrbitControl(screen, mainCamera)); document.querySelector('body').appendChild(scene); // Load a gltf model let gltfroot = await Asset.loadGLTF(gltf, screen, skybox); scene.appendChild(gltfroot); } main();

Create a quad with texture

js
// Create an entity let quad = scene.appendChild(EntityMgr.create('quad')); // Load a material let quadMat = await Asset.LoadMaterial('stylize'); // PBR material // Load a texture let floor = await Asset.loadTexture(CDN + 'res/textures/floor.png', { minFilter: screen.gl.NEAREST_MIPMAP_NEAREST }); floor.flipY = true; // Attach texture to material we created Material.setTexture(quadMat, 'baseColorTexture', floor); quadMat.shader.macros['HAS_BASECOLOR_MAP'] = ''; // Create a renderer component let quadMR = new MeshRenderer(screen, new QuadMesh(), quadMat); // Attach renderer to entity quad.addComponent(quadMR); // Set local translate [x, y, z] quad.components.Transform.translate[1] = -1; // Set euler angle x, y, z quat.fromEuler(quad.components.Transform.quaternion, -90, 0, 0); // The original size of quad is 2x2 vec3.scale(quad.components.Transform.scale, quad.components.Transform.scale, 9);

Deployment

sh
git clone --recursive https://github.com/but0n/Ashes.git cd Ashes # if you don't have yarn installed npm install -g yarn yarn yarn dev

Contributors

Showing top 3 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from but0n/Ashes via the GitHub API.Last fetched: 6/14/2026