All Projects → lighttransport → Nanort

lighttransport / Nanort

Licence: mit
NanoRT, single header only modern ray tracing kernel.

Projects that are alternatives of or similar to Nanort

vulkan-raytracing
"Simple" Vulkan raytracing
Stars: ✭ 27 (-96.32%)
Mutual labels:  raytracing
C Ray
C-Ray is a small, simple path tracer written in C
Stars: ✭ 323 (-55.99%)
Mutual labels:  raytracing
Sort
Simple Open-source Ray Tracer
Stars: ✭ 485 (-33.92%)
Mutual labels:  raytracing
OpenTK-PathTracer
C# OpenGL Path Tracer, Real-Time GPU accelerated
Stars: ✭ 22 (-97%)
Mutual labels:  raytracing
Diligentcore
Core functionality of Diligent Engine
Stars: ✭ 263 (-64.17%)
Mutual labels:  raytracing
Quartz
Vulkan RTX path tracer with a declarative ES7-like scene description language.
Stars: ✭ 367 (-50%)
Mutual labels:  raytracing
ArtOfIllusion
Art of Illusion modeling and rendering suite - core application and tools
Stars: ✭ 58 (-92.1%)
Mutual labels:  raytracing
Luxcore
LuxCore source repository
Stars: ✭ 601 (-18.12%)
Mutual labels:  raytracing
Edxray
A physically based renderer which implements many state of the art techniques in light transport simulation, material modeling, sampling and reconstruction.
Stars: ✭ 270 (-63.22%)
Mutual labels:  raytracing
Vk raytracing tutorial khr
Ray tracing examples and tutorials using VK_KHR_ray_tracing
Stars: ✭ 461 (-37.19%)
Mutual labels:  raytracing
webrays
WebRays - Ray Tracing on the Web
Stars: ✭ 38 (-94.82%)
Mutual labels:  raytracing
miniRT
School project for 42 Paris
Stars: ✭ 23 (-96.87%)
Mutual labels:  raytracing
Tinyraytracer
A brief computer graphics / rendering course
Stars: ✭ 3,971 (+441.01%)
Mutual labels:  raytracing
CSharpDirectXRaytracing
DirectX Raytracing Tutorials in CSharp
Stars: ✭ 53 (-92.78%)
Mutual labels:  raytracing
Raytracer.hpp
Simple compile-time raytracer using C++17
Stars: ✭ 529 (-27.93%)
Mutual labels:  raytracing
Aurora
An offline ray tracing-based renderer for fun
Stars: ✭ 45 (-93.87%)
Mutual labels:  raytracing
Raytracing.github.io
Main Web Site (Online Books)
Stars: ✭ 4,485 (+511.04%)
Mutual labels:  raytracing
Vk mini path tracer
A beginner-friendly Vulkan path tracing tutorial in under 300 lines of C++.
Stars: ✭ 599 (-18.39%)
Mutual labels:  raytracing
Voxel Cone Tracing
A real-time global illumination implementation using voxel cone tracing. Implemented in C++ and GLSL.
Stars: ✭ 555 (-24.39%)
Mutual labels:  raytracing
Awesome Ray Tracing
Curated list of ray tracing resources
Stars: ✭ 414 (-43.6%)
Mutual labels:  raytracing

NanoRT, single header only modern ray tracing kernel.

Travis Build Status AppVeyor Build status

Path tracing example contributed by https://github.com/daseyb

NanoRT is simple single header only ray tracing kernel.

Features

  • Portable C++
  • BVH spatial data structure for efficient ray intersection finding.
    • Should be able to handle ~10M triangles scene efficiently with moderate memory consumption
  • Custom geometry & intersection
    • Built-in triangle mesh gemetry & intersector is provided.
  • Cross platform
    • MacOSX, Linux, Windows, iOS, Android, ARM, x86, SPARC, (maybe) MIPS, (will be) RISC-V, etc.
    • For example, NanoRT works finely on Raspberry Pi 2 (arm 32bit) and Raspberrry Pi 3!(AARCH64 kernel)
  • GPU efficient data structure
    • Built BVH tree from NanoRT is a linear array and does not have pointers, thus it is suited for GPU raytracing (GPU ray traversal).
  • OpenMP multithreaded BVH build.
  • Robust intersection calculation.
  • Double precision support
    • Beneficial for HPC and scientific visualization.

Applications

Projects using NanoRT

API

nanort::Ray represents ray. The origin org, the direction dir (not necessarily normalized), the minimum hit distance min_t(usually 0.0) and the maximum hit distance max_t (usually too far, e.g. 1.0e+30) must be filled before shooting ray.

nanort::BVHAccel builds BVH data structure from geometry, and provides the function to find intersection point for a given ray.

nanort::BVHBuildOptions specifies parameters for BVH build. Usually default parameters should work well.

nanort::BVHTraceOptions specifies ray traverse/intersection options.

template<typename T>
class {
  T org[3];        // [in] must set
  T dir[3];        // [in] must set
  T min_t;         // [in] must set
  T max_t;         // [in] must set
  unsigned int type;  // optional. ray type.
} Ray;

class BVHTraceOptions {
  // Trace rays only in face ids range. faceIdsRange[0] < faceIdsRange[1]
  // default: 0 to 0x3FFFFFFF(2G faces)
  unsigned int prim_ids_range[2];
  bool cull_back_face; // default: false
};

nanort::BVHBuildOptions<float> build_options; // BVH build option(optional)

const float *vertices = ...;
const unsigned int *faces = ...;

// Need to specify stride bytes for `vertices`.
// When vertex is stored XYZXYZXYZ... in float type, stride become 12(= sizeof(float) * 3).
nanort::TriangleMesh<float> triangle_mesh(vertices, faces, /* stride */sizeof(float) * 3);
nanort::TriangleSAHPred<float> triangle_pred(vertices, faces, /* stride */sizeof(float) * 3);

nanort::BVHAccel<float> accel;
ret = accel.Build(mesh.num_faces, triangle_mesh, triangle_pred, build_options);

nanort::TriangleIntersector<> triangle_intersecter(vertices, faces, /* stride */sizeof(float) * 3);

nanort::Ray<float> ray;
// fill ray org and ray dir.
...
// fill minimum and maximum hit distance.
ray.min_t = 0.0f;
ray.max_t = 1.0e+30f;

nanort::TriangleIntersection<float> isect;

// Store nearest hit point to `isect` and returns true if the hit point found.
BVHTraceOptions trace_options; // optional
bool hit = accel.Traverse(ray, triangle_intersecter, &isect, trace_options);

Application must prepare geometric information and store it in linear array.

For a builtin Triangle intersector,

  • vertices : The array of triangle vertices (e.g. xyz * numVertices)
  • faces : The array of triangle face indices (3 * numFaces)
  • stride : Byte stride of each vertex data

are required attributes.

Usage

// NanoRT defines template based class, so no NANORT_IMPLEMENTATION anymore.
#include "nanort.h"
Mesh mesh;
// load mesh data...
nanort::BVHBuildOptions<float> options; // Use default option
nanort::TriangleMesh<float> triangle_mesh(mesh.vertices, mesh.faces, /* stride */sizeof(float) * 3);
nanort::TriangleSAHPred<float> triangle_pred(mesh.vertices, mesh.faces, /* stride */sizeof(float) * 3);
nanort::BVHAccel<float> accel;
ret = accel.Build(mesh.vertices, mesh.faces, mesh.num_faces, options);
assert(ret);
nanort::BVHBuildStatistics stats = accel.GetStatistics();
printf("  BVH statistics:\n");
printf("    # of leaf   nodes: %d\n", stats.num_leaf_nodes);
printf("    # of branch nodes: %d\n", stats.num_branch_nodes);
printf("  Max tree depth   : %d\n", stats.max_tree_depth);

std::vector<float> rgb(width * height * 3, 0.0f);
const float tFar = 1.0e+30f;
// Shoot rays.
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int y = 0; y < height; y++) {
  for (int x = 0; x < width; x++) {
    BVHTraceOptions trace_options;
    // Simple camera. change eye pos and direction fit to .obj model.
    nanort::Ray<float> ray;
    ray.min_t = 0.0f;
    ray.max_t = tFar;
    ray.org[0] = 0.0f;
    ray.org[1] = 5.0f;
    ray.org[2] = 20.0f;
    float3 dir;
    dir[0] = (x / (float)width) - 0.5f;
    dir[1] = (y / (float)height) - 0.5f;
    dir[2] = -1.0f;
    dir.normalize();
    ray.dir[0] = dir[0];
    ray.dir[1] = dir[1];
    ray.dir[2] = dir[2];

    nanort::TriangleIntersector<> triangle_intersecter(mesh.vertices, mesh.faces, /* stride */sizeof(float) * 3);
    nanort::TriangleIntersection<> isect,
    bool hit = accel.Traverse(ray, triangle_intersector, &isect, trace_options);
    if (hit) {
      // Write your shader here.
      float3 normal;
      unsigned int fid = triangle_intersector.intersect.prim_id;
      normal[0] = mesh.facevarying_normals[3*3*fid+0]; // @todo { interpolate normal }
      normal[1] = mesh.facevarying_normals[3*3*fid+1];
      normal[2] = mesh.facevarying_normals[3*3*fid+2];
      // Flip Y
      rgb[3 * ((height - y - 1) * width + x) + 0] = fabsf(normal[0]);
      rgb[3 * ((height - y - 1) * width + x) + 1] = fabsf(normal[1]);
      rgb[3 * ((height - y - 1) * width + x) + 2] = fabsf(normal[2]);
    }
  }
}

Defines

NANORT_USE_CPP11_FEATURE : Enable C++11 feature
NANORT_ENABLE_PARALLEL_BUILD : Enable parallel BVH build(OpenMP version is not yet fully tested).

More example

See examples directory for example renderer using NanoRT.

Custom geometry

Here is an example of custom geometry.

  • [x] Spheres(particles) examples/particle_primitive/
  • Cubic Bezier Curves
    • [x] Approximate as lines examples/curves_primitive/
    • [ ] Recursive Ray-Bezier intersection.
  • [x] Cylinders examples/cylinder_primitive/

And plesae see API at wiki: https://github.com/lighttransport/nanort/wiki/API

License

nanort.h is licensed under MIT license.

NanoRT uses stack_container.h which is licensed under:

// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

NanoRT examples use some external third party libraries. Licenses for such third party libraries obey their own license.

Lucy statue model is from The Stanford 3D Scanning Repository http://graphics.stanford.edu/data/3Dscanrep/

TODO

PR are always welcome!

  • [ ] Optimize ray tracing kernel
  • [ ] Better cmake build.
  • [ ] Implement more Embree compatible API.
  • [ ] Scene graph support.
    • [x] NanoSG, Minimal scene graph library. examples/nanosg
    • [ ] Instancing support.
  • [ ] Fix multi-hit ray traversal.
  • [ ] Optimize Multi-hit ray traversal for BVH.
  • [ ] Ray traversal option.
    • [x] FaceID range.
    • [x] Double sided on/off.
    • [ ] Ray offset.
    • [x] Avoid self-intersection(BVHTraceOptions.skip_prim_id).
    • [x] Custom intersection filter through C++ template.
  • [ ] Fast BVH build
  • [ ] Efficient BVH build
    • [ ] Spatial split BVH
  • [ ] Motion blur
  • [ ] Fast, Accurate ray curve intersection
    • [ ] Phantom Ray-Hair Intersector
  • [x] Example bi-directional path tracing renderer by @tatsy.
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].