Skip to content

maierfelix/momo

Repository files navigation

momo

This project allows to render photorealistic images. The rendering process is accelerated using NVIDIA's new RTX technology, which drastically reduces the necessary time to render high-quality images.

Screenshots:

Meet Mat
Bedroom
Living Room

Scenes are downloaded from blendswap

TODO:

  • Transmissive Material support
  • Glass shader
  • HDR environment probes
  • Optix AI Denoiser (recently got Vulkan interopability)
  • HTML5 based GUI using azula
  • Validate Clearcoat Parameter

API:

See this file for an example on how to use the API.

To create a new instance of momo, use:

let momo = new Momo();
await momo.create();

To start the path tracing process:

momo.execute();

Loading Resources:

Momo.prototype.loadGeometryFile

This method allows to read a geometry file from a path. Currently there is only support for Wavefront OBJ files.

Name Type Description
path String Path to the geometry file to load
let Quad = momo.loadGeometryFile("assets/models/quad.obj");

Momo.prototype.loadTextureFile

This method allows to read a texture file from a path. There is support for JPG and PNG files.

Name Type Description
path String Path to the texture file to load
let Texture = momo.loadTextureFile("assets/textures/white.png");
let Texture = momo.loadTextureFile("assets/textures/white.jpg");

Momo.prototype.createTextureFromColor

This method allows to manually create a texture.

Name Type Description
color Array Array describing the color for the texture
width Number Width of the texture
height Number Height of the texture
let RedTexture = momo.createTextureFromColor({
  color: [255, 0, 0],
  width: 128,
  height: 128
});

Scene Description:

There are multiple methods to describe a scene. Note that Momo has an instancing oriented style, meaning that it recommended to re-use geometry and materials.

Transforms

A transform has the following layout:

Name Type Description
scale Object The scaling of an Object
rotation Object The rotation of an Object (in degree)
translation Object The translation of an Object
let transform = {
  scale: { x: 0.0, y: 0.0, z: 0.0 },
  rotation: { x: 0.0, y: 0.0, z: 0.0 },
  translation: { x: 0.0, y: 0.0, z: 0.0 }
};

Transforms are used across multiple locations in the API.

Materials

Name Type Description
albedo Object In SRGB space
normal Object In SRGB space
metalRoughness Object In SRGB space, R-Channel metalness, G-Channel roughness
color Array
metalness Number
specular Number
roughness Number
specularTint Number
sheenTint Number
sheen Number
clearcoatGloss Number
clearcoat Number
subsurface Number
// Material without using textures
let Material0 = Demo.addMaterial({
  color: [248, 122, 122],
  metalness: 0.175,
  roughness: 0.1,
  specular: 0.75,
  sheen: 0.35,
  sheenTint: 0.78
});

// Material with textures
let albedo = Demo.loadTextureFile("assets/textures/albedo.jpg");
let normal = Demo.loadTextureFile("assets/textures/normal.jpg");
let metalRoughness = Demo.loadTextureFile("assets/textures/metal_roughness.jpg");
let Material1 = Demo.addMaterial({
  albedo,
  normal,
  metalRoughness,
  specular: 0.5,
  sheen: 0.25,
  sheenTint: 0.38
});

Materials are used across multiple locations in the API.

Mesh Instancing:

After loading a geometry file using loadGeometryFile, you can now start adding mesh instances of that geometry to your scene.

Name Type Description
transform Object An Object describing the transformation of the instance
material Object Object reference to a material
Quad.addMeshInstance({
  transform,
  material
});

Emitter Instancing:

Similar to mesh instancing, you can also add an emitter instance of the geometry which is then interpreted as a light source.

Name Type Description
transform Object An Object describing the transformation of the instance
material Object Object reference to a material with only a color property
Quad.addEmitterInstance({
  transform,
  material
});

Note that the only valid property of an Emitter's material is a color property, which describes the color and the energy of the light (The color isn't clamped to 0-255 range).

Quad.addEmitterInstance({
  transform,
  material: Demo.addMaterial({ color: [800, 600, 400] })
});

WebAssembly:

This project uses the following WebAssembly ports of popular C/C++ libraries:

Note that when reading large Object or Texture files, the memory usage gets quite high. That's because of a WebAssembly limitation where it's not possible to actually free/shrink WebAssembly memory, you can only grow it. This can be bypassed by e.g. destroying the entire WebAssembly module after each operation.

About

A Vulkan RTX Path Tracer

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published