Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

🚧 This project is in active beta development. This means the API is unstable, features may be added or removed, and breaking changes are likely to occur frequently and without notice as the design is refined.

CI Release PyPI Docs License

Efficient Renderer for Natural and Interplanetary Environments (Ernie)

Ernie is a physically accurate, real-time, spectral renderer for interplanetary environments.

We provide C++ and Python APIs and a Hydra-like scene API. It is a Vulkan 1.3 rasterizer that runs on Linux, and builds on Windows and macOS (experimental: not yet tested there). Ernie is designed around physical quantities rather than artistic parameters: lights, materials and cameras are described the way they are measured, so a render can be compared against a real instrument. For reinforcement learning, Ernie renders batches of cameras in one step, shares data zero copy with any DLPack tensor (PyTorch, JAX, Warp, NumPy), and has a fast mode with simpler shading.

Ernie's key features related to planetary robotics and sensing:

  • Camera effects and modeling: exposure, aperture, motion blur, rolling shutter, lens distortion and vignetting, with perspective, fisheye and orthographic projections.
  • Real camera specs: from quantum efficiency curves to full well, read noise, dark current, PRNU, DSNU, gain and ADC bit depth, and line-scan pushbroom cameras like LROC's, enabling users to model the noise and effects of those instruments.
  • Terrain: a first-class citizen, with a built-in Terrain prim type with continuous level of detail through quadtrees, updated in place where its heights change. With a radius, a Terrain is a whole planet or moon, drawn from orbit down to the ground with cube-sphere level of detail.
  • GPU interop: deforming meshes, instances and points from CUDA or Warp arrays without copies, useful for rover simulations and particle simulations.
  • Spectral-first rendering: light is carried in spectral bands (16 across 380-780 nm by default) from the light sources, through the materials, to the sensor.
  • Star fields: a built-in StarField prim allowing users to plug in their own star catalogs, with brightness from magnitudes and color from B-V indices, so you can see how camera exposure affects the visible stars.
  • Lighting: distant lights have an angle parameter, giving smooth penumbrae based on the light's width in the sky. Lights also take illuminants (blackbody, CIE daylight) and custom spectral curves, for example to model Earthshine on the lunar surface.
  • Customizable and extendable: write your own sensor filters in Slang and build up your own chains (noise models, lens flare, vignetting), designed for efficiency and throughput, and plug in custom BRDFs for the planetary reflectances you encounter. Hapke, Lommel-Seeliger, lunar-Lambert, Oren-Nayar and Lambert come built in.
  • Batch rendering: many environments ("worlds"), each with its own camera, rendered in one step for RL and Monte Carlo workloads.
  • Debug drawing: an easy-to-use API to add custom labels, trajectories and overlays to the scene.
  • Floating origin: prevents precision issues in large-scale scenes.
  • Viewer: a viewer class to easily spin up a GUI with customizable panels to integrate with your own simulations or workflows.

For a more detailed overview of the features, see our documentation.

Future work:

  • A fully USD- and glTF-compliant renderer, loading OpenUSD, glTF, OBJ, STL and 3D Tiles, with the glTF material system, UsdPreviewSurface shaders and MDL.
  • Atmosphere rendering, both on and above a planet, for LEO simulations or Mars rovers.
  • Dust and other volumes from particle simulations through NanoVDB.
  • Global illumination for reflections
  • USGS CSM camera models for advanced, non-standard cameras and their noise.
  • OpenXR, so users can easily connect headsets to an Ernie viewer.
  • A ray-tracing backend alongside the rasterizer.
  • A fast mode for RL training: a forward renderer with a smaller feature set and higher throughput.
  • Windows support, and tested macOS support.
  • Continued test assets and benchmark scenes.
  • Guassian splat and particle fields
  • More sensor support for Lidars and Radars.
  • Integrations into Newton Viewer, Chrono Sensor, and IsaacLab.
  • Compare benchmarks with Newton Warp Raytrace, Madrona both in speed, throughput, and image quality.

Getting Started

Python

pip install ernie-renderer
from PIL import Image

import ernie
from ernie import tokens

scene = ernie.Scene()
scene.define("/World/Ground", ernie.GroundPlane)
scene.define("/World/Rock", ernie.Sphere, translate=(0, 0, 1))  # 1 m up
scene.define("/World/Sun", ernie.DistantLight).set(
    tokens.TRANSFORM, ernie.distant_light_transform((0.4, -0.6, 0.7))
)
scene.define("/World/Camera", ernie.Camera).set(
    tokens.TRANSFORM, ernie.look_at_transform((0, -8, 3), (0, 0, 1))
)
scene.define(
    "/Render/Settings", ernie.RenderSettings, camera="/World/Camera", resolution=(640, 480)
)

renderer = ernie.Renderer()
image = renderer.render(scene)  # a (480, 640, 4) uint8 NumPy array
Image.fromarray(image).save("ernie.png")

C++

With Ernie installed (see Installation), find it with CMake:

find_package(Ernie REQUIRED)
target_link_libraries(my_app PRIVATE Ernie::ernie)
#include <ernie/scene/camera_schemas.h>
#include <ernie/scene/geometry_schemas.h>
#include <ernie/scene/light_schemas.h>
#include <ernie/scene/render_schemas.h>
#include <ernie/scene/schema.h>
#include <ernie/scene/tokens.h>
#include <ernie/scene/xform.h>
#include <ernie/session/renderer.h>

int main() {
    using namespace ernie;
    Scene scene;
    GroundPlane::Define(scene, "/World/Ground");
    Sphere::Define(scene, "/World/Rock");
    SetXform(scene, "/World/Rock", {.translate = glm::dvec3(0.0, 0.0, 1.0)});  // 1 m up
    DistantLight::Define(scene, "/World/Sun");
    scene.Set("/World/Sun", tokens::kTransform, DistantLightTransform({0.4, -0.6, 0.7}));
    Camera::Define(scene, "/World/Camera");
    scene.Set("/World/Camera", tokens::kTransform,
              LookAtTransform({0.0, -8.0, 3.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}));
    RenderSettings::Define(scene, "/Render/Settings")
        .SetCamera("/World/Camera")
        .SetResolution({640, 480});

    Renderer renderer;
    Tensor image = renderer.Render(scene);  // 480 x 640 x 4 bytes of LdrColor on the CPU
}

For the prim types and their attributes, transforms, relationships, arrays, validation, loading scenes from JSON and declaring your own types, see Describing scenes.

Examples

Planned future examples.

Cameras

  • LRO NAC and WAC
  • Shadowcam
  • Mars2020 Navcam, Mastcam
  • LWIR, NIR, UV
  • Pinhole, fisheye, orthographic
  • Narrowband camera
  • Distortion

Camera Filters and Noise

  • Vignetting
  • Lens flare
  • Bloom
  • Narrowband filter viewing laser lines

Terrain

  • SLDEM global and multiple tiles
  • Mars terrains
  • Asteroid shape files
  • Saturn and its rings
  • Pluto

Lighting

  • Distant light
  • Custom radiance curves to model Earthshine
  • Dome light shadows
  • Illuminants across the same scene
  • Laser lines competing with sunlight

Star Field

  • Hipparcos star catalog
  • Stars viewed from another galaxy

Atmosphere

  • Earth atmosphere (from orbit and ground)
  • Mars atmosphere

Batched and RL

  • Batched camera rendering and setting poses

Viewer

  • Adding a custom panel
  • Hiding default panels and menus
  • Extending HUD options
  • Physics debug draw overlays

Installation

Precompiled binaries

The Python wheel is on PyPI as ernie-renderer (pip install ernie-renderer, then import ernie; Python 3.12+). It bundles everything, the viewer included, but a Vulkan driver.

Each GitHub release also has an ernie package for Ubuntu 22.04+, Debian 12+ and RHEL 9+ (and a tarball for other distributions), with the library, the viewer, and the headers and CMake package for building against it.

sudo apt install ./ernie_*.deb    # Debian, Ubuntu
sudo dnf install ./ernie-*.rpm    # RHEL, Rocky, Fedora

Both need a Vulkan 1.3 driver: your GPU vendor's, or Mesa's (mesa-vulkan-drivers, which includes the lavapipe software driver for machines without a GPU).

Build from source

Ernie needs CMake 3.24+, a C++20 compiler and a Vulkan 1.3 driver; it fetches its other dependencies (see third_party/README.md).

cmake -S . -B build -DERNIE_BUILD_TESTS=ON -DERNIE_INSTALL=ON -DERNIE_BUILD_PYTHON=ON -DERNIE_BUILD_APP=ON
cmake --build build
ctest --test-dir build -j4              # C++, GPU and Python tests
build/bin/ernie                         # the viewer
cmake --install build --prefix ~/.local # libernie, headers and the CMake package

A Python wheel bundles the module with the Slang runtime it loads:

uv build --wheel --out-dir dist .
uv pip install dist/ernie_renderer-*.whl

Packages are built with cmake --preset package-deb (or package-rpm), cmake --build --preset package-deb and cpack --preset package-deb.

See CONTRIBUTING.md for the build options, testing without a GPU on lavapipe, and benchmarks.

License

Ernie is licensed under the BSD 3-Clause License. The third-party libraries it bundles keep their own licenses, listed in third_party/README.md.

Metadata

Release files for ernie-renderer 0.1.0.dev202

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ernie-renderer 0.1.0.dev202
File Size Uploaded
ernie_renderer-0.1.0.dev202.tar.gz 1.4 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for ernie-renderer 0.1.0.dev202
File Interpreter ABI Platform
ernie_renderer-0.1.0.dev202-cp312-abi3-manylinux_2_34_x86_64.whl CPython 3.12 abi3 Linux glibc 2.34+ x86-64 Details
ernie_renderer-0.1.0.dev202-cp312-abi3-manylinux_2_34_aarch64.whl CPython 3.12 abi3 Linux glibc 2.34+ ARM64 Details

Total release size: 50.4 MB

Release files / ernie_renderer-0.1.0.dev202.tar.gz

Download URL ernie_renderer-0.1.0.dev202.tar.gz
Size 1.4 MB
Tags Source
SHA-256 checksum
How to use checksums
f0fca554e054e1fd9ca505d5249ba94291d5eee0a689a9034e41c16d3be3ba8b
BLAKE2b-256 checksum
How to use checksums
7f6378d4ebb46c37e58451bbae40b43f183fda5856c4805697bbcc099acffb7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release files / ernie_renderer-0.1.0.dev202-cp312-abi3-manylinux_2_34_x86_64.whl

Download URL ernie_renderer-0.1.0.dev202-cp312-abi3-manylinux_2_34_x86_64.whl
Size 25.2 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
b295d47a65c257e03f49e528cd2d26b745b6e40cf4a84d01ad4b02edef7e09c9
BLAKE2b-256 checksum
How to use checksums
a02f1fd85d7bebebff6c58875c4cdac882d9d497af1373dcc35e5ed3d261b486
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release files / ernie_renderer-0.1.0.dev202-cp312-abi3-manylinux_2_34_aarch64.whl

Download URL ernie_renderer-0.1.0.dev202-cp312-abi3-manylinux_2_34_aarch64.whl
Size 23.8 MB
Tags CPython 3.12 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
a7c4a4426cfcbaf9e32eaad70501fef1edfef6b76174a327475051b1415dfc7d
BLAKE2b-256 checksum
How to use checksums
53e2e2cd107daf9cdcc282cf6fad10cd2cc61f288b2f7c0593a220061955467c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0.dev202 This release

3 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page