Selected Projects


tray_rust is a toy physically based ray tracer built off of the techniques discussed in Physically Based Rendering. It began life as a port of tray to Rust to check out the language. The renderer is currently capable of path tracing, supports triangle meshes (MTL support coming soon), and various physically based material models (including measured data from the MERL BRDF Database) along with rigid body animation and image-parallel distributed rendering. More details on rendering performance and other features can be found in the readme README.

tray_rust can also render animations, and is the renderer I’ve used for the University of Utah’s teapot rendering competition after the first year. The video is my submission from 2016. To simplify making scenes for tray_rust I also wrote a Blender plugin which I used to make the animation shown, and is the easiest way to create scenes for the renderer though some features are still needed.

Star Fork


ispc-rs is a small Rust library meant to be used as a compile time dependency for Rust projects to allow them to build and link with code written in ISPC. ISPC is a language that makes it possible to take advantage the CPU’s vector units without needing hand-written intrinsics. Through this library it’s easy to write very fast vector code in ISPC and link it with (still quick!) higher-level code in Rust to get a good balance of high performance and ease of use.

The images shown above are from the rt example (top row) which demonstrates a simple fast and parallel path tracer and the ddvol example (bottom row) which is a scientific visualization volume renderer. Both use higher level Rust code to read in a scene file and setup the objects in the scene and then call into ISPC to render in parallel, making good use of the CPU’s SIMD units.

Star Fork


μPacket is an extremely simple packet based ray tracer that uses the AVX/AVX2 instruction set to trace eight rays at once through the scene. Currently it only supports spheres and planes with Lambertian BRDFs illuminated by a single point light. Illumination is computed with Whitted ray tracing, although recursion only goes as far as computing shadows since there are no reflective or transmissive materials at the moment.

Ray packets were first introduced by Wald et al., 2001 and are now widely used in high performance ray tracers like Embree due to the performance gain achieved with good packet (and now stream) tracing techniques.

Current plans for this project are to switch to trace ray streams and add support for a path tracing integrator for higher quality images.

Star Fork


topo-vol is a topology guided volume exploration and analysis tool, written for the final project in Bei Wang’s Computational Topology Course. It is built on top of the Topology ToolKit and VTK for computation, and uses ImGui and a custom rendering system for the UI and volume rendering. By computing relevant topological structures (e.g. the contour tree) and classifying segments of data corresponding to the branches in this tree we can avoid occlusion issues with global transfer functions and create more useful, detailed renderings. See the report for more details.

Star Fork


tray is a toy physically based ray tracer built off of the techniques discussed in Physically Based Rendering. It currently has support for path tracing, bidirectional path tracing and photon mapping. tray also supports physically materials such as microfacet models like Torrance-Sparrow and measured data from the MERL BRDF Database.

This is the project tray_rust is based on and as such may not see much more development since most of my ray tracing work is now going on there.

Star Fork


A Rust library for computing B-spline interpolating curves on generic control points. bspline can be used to evaluate B-splines of varying orders on any type that can be linearly interpolated, ranging from floats, positions, RGB colors to transformation matrices and so on. The bspline logo (above) was generated using this library with a cubic B-spline in 2D for the positioning of the curve and a quadratic B-spline in RGB space to color it.

Star Fork

Spline Viewer

A viewer for B-spline curves and surfaces, initially written for a course on computer aided geometric design. You can edit and create 2D B-splines and tweak some properties of loaded 3D curves and surfaces. Useful for learning about and playing with B-splines.

Star Fork


tobj is a tiny OBJ loader in Rust that draws inspiration for its API and design from Syoyo’s excellent library, tinyobjloader. The crate aims to be a simple, fast and lightweight option for loading OBJ and MTL files for easy integration with realtime and offline renderers, or really any other project where you need to load OBJ files!

The image shown is from a demo viewer written to test tobj named tobj_viewer displaying the Rungholt model. The model can be found on Morgan McGuire’s meshes page and was originally built by kescha.

Star Fork


This is sort of an implementation of Scalable Ambient Obscurance by McGuire et al. however I make a few simplifying shortcuts in my implementation and don’t achieve as good performance or quality. I was also unable to get their new recommended estimator to behave so this implementation still uses the Alchemy AO estimator initially recommended in the paper. There’s a somewhat longer write up available on my classpage since this was initially implemented as a class project.

The image shows just the ambient occlusion value for a view of the Crytek Sponza scene.

Star Fork


lfwatch is a lightweight file watcher for Windows, Linux and OS X. It monitors some desired directories for file changes and calls the callback set for the directory with information about the file change event. This was written to do hot reloading of GLSL shaders but could be useful for some other applications.

Star Fork