A real-time, portable, and deterministic software ray-tracer and ray-marcher written in C++.
- Analytical Direct Lighting: Deterministic evaluation for point and directional light sources.
- Physically Based Shading: Full Cook-Torrance BRDF evaluation via GGX.
- SDF Ambient Occlusion: Fast proximity occlusion calculated via ray-marched distance fields across all primitives.
- Physical Properties: Support for roughness, metalness, and emission properties.
- Texture Mapping: Optional mapping for albedo, roughness, emission, and bump maps (supports explicit UVs on polygons and planar projection on primitives).
- Glass Refraction:
IORandTransmissionproperties for emulating transparent objects.
- Hybrid Representation: Scene-wide Surface Area Heuristic BVH that captures individual primitives alongside an SDF evaluator for CSG trees.
- Mesh Loading:
.obj+.mtlfile parser for meshes. - Analytic Primitives: Sphere, Box, Plane, Torus, and Cylinder primitives.
- Constructive Solid Geometry: Full boolean operations supported in CSG trees for all primitives.
- Windows (With multithreading support
#define MULTI_THREADED_RENDERINGinRaytracer.h) - Nintendo 3DS (Runs poorly, more of a proof-of-concept)
- Download and install Visual Studio 2026 with the C++ development workload along with Clang-CL support.
- Open the Ether solution.
- Compile.
- Download and install the devkitPro toolchain and include 3DS support.
- Enter the Ether directory and run
make.
In order to use .obj files, you must place them inside of a folder named Data in the root of this repository. All paths in Ether are relative to this folder. Loading an object from Teapot/teapot.obj points to </path/to/repository>/Data/Teapot/teapot.obj. The 3DS build automatically includes this entire folder in the RomFS of the 3dsx.