Git Product home page Git Product logo

momo's Introduction

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.

momo's People

Contributors

maierfelix avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

ajkaczmar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.