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.

It is a Vulkan rasterizer for Linux, Windows and macOS (through MoltenVK), with C++ and Python APIs and a Hydra-like scene API. Ernie is designed around physical quantities, efficient batched rendering and modularity.

Ernie is built to be customized and to work alongside other tools. You can add your own BRDFs, sensor filters and light patterns. Rendered outputs and scene attributes (transforms, mesh vertices, light parameters and more) are shared zero copy with any DLPack tensor (PyTorch, JAX, Warp, NumPy), which makes Ernie a good fit for real-time physics simulation and reinforcement learning. Support for OpenUSD and glTF scenes, and for MDL and MaterialX materials, is planned.

Its key features are aimed at planetary robotics and sensing:

  • Cameras and sensors
    • Exposure, aperture, motion blur, rolling shutter, lens distortion and vignetting.
    • Perspective, fisheye and orthographic projections, and line-scan pushbroom cameras like LROC's.
    • Real sensor specs: quantum efficiency curves, full well, read noise, dark current, PRNU, DSNU, gain and ADC bit depth.
    • USGS CSM camera models for non-standard instruments.
    • Sensor filter chains (noise models, lens flare, vignetting), with your own filters written in Slang.
  • Planetary environments
    • Terrain as a built-in prim, with continuous level of detail through quadtrees, updated in place where its heights change.
    • Whole planets and moons from a Terrain with a radius, drawn from orbit down to the ground.
    • Earth and Mars atmospheres from physical models, seen from the ground or from orbit, with aerial perspective.
    • Star fields from your own catalogs, with brightness from magnitudes and color from B-V indices.
  • Light and materials
    • Spectral rendering: light is carried in bands (16 across 380-780 nm by default) from the sources, through the materials, to the sensor.
    • Distant lights with an angular size, for soft penumbrae from the sun's width in the sky.
    • Illuminants (blackbody, CIE daylight, the measured solar spectrum) and custom spectral curves, for example Earthshine on the lunar surface.
    • Hapke, Lommel-Seeliger, lunar-Lambert, Oren-Nayar and Lambert BRDFs built in, and your own for the surfaces you study.
  • Simulation and learning
    • Batch rendering: many worlds, each with its own camera, rendered in one step for RL and Monte Carlo workloads.
    • Meshes, instances and points written from CUDA or Warp arrays without copies, for rover and particle simulations.
    • A floating origin, so large scenes keep their precision.
  • Tools
    • A viewer with customizable panels, to drive your own simulations and workflows.
    • Debug drawing: labels, trajectories and overlays in the scene.

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 and MaterialX support
  • Dust and other volumes from particle simulations through NanoVDB
  • Differentiable rendering
  • Global illumination
  • OpenXR integrations
  • WebGPU backend
  • Gaussian splat and particle fields.
  • Lidar and radar sensors
  • A real-time ray-tracing renderer alongside the rasterizer
  • Integrations into Newton Viewer, Chrono Sensor, and IsaacLab
  • Compare benchmarks with RTX, Cycles, 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.

Demos

  • Cornell box

Cameras

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

Camera Filters and Noise

  • Vignetting
  • Lens flare
  • Bloom
  • Narrowband filter

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 (compare against existing images)

Volumes

  • NanoVDB interop
  • Clouds in Earth orbit
  • Dust clouds on lunar surface

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.dev266

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.dev266
File Size Uploaded
ernie_renderer-0.1.0.dev266.tar.gz 1.7 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for ernie-renderer 0.1.0.dev266
File
ernie_renderer-0.1.0.dev266-cp312-abi3-win_amd64.whl CPython 3.12 abi3 Windows x86-64 Details
ernie_renderer-0.1.0.dev266-cp312-abi3-manylinux_2_34_x86_64.whl CPython 3.12 abi3 Linux glibc 2.34+ x86-64 Details
ernie_renderer-0.1.0.dev266-cp312-abi3-manylinux_2_34_aarch64.whl CPython 3.12 abi3 Linux glibc 2.34+ ARM64 Details
ernie_renderer-0.1.0.dev266-cp312-abi3-macosx_11_0_arm64.whl CPython 3.12 abi3 macOS 11.0+ ARM64 Details

Total release size: 125.1 MB

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

Download URL ernie_renderer-0.1.0.dev266.tar.gz
Size 1.7 MB
Tags Source
SHA-256 checksum
How to use checksums
85960a7c831156de8a0f48bbb3296a1d3cefdc68fa970e1fb875c99a5a05e191
BLAKE2b-256 checksum
How to use checksums
117cceb42f3d3d4620d16998c2697e484e7ed3818824cac4ec1f5da30a18fbb0
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.dev266-cp312-abi3-win_amd64.whl

Download URL ernie_renderer-0.1.0.dev266-cp312-abi3-win_amd64.whl
Size 21.9 MB
Tags CPython 3.12 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
9cc6f486772f41496df1f51b089c2cfee5d18b5d6d41b0217ed7f6af28fe10d7
BLAKE2b-256 checksum
How to use checksums
b90bb865343ea454247dee9b90e6196e03966d13ca716e43b7a1a59232ae71da
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.dev266-cp312-abi3-manylinux_2_34_x86_64.whl

Download URL ernie_renderer-0.1.0.dev266-cp312-abi3-manylinux_2_34_x86_64.whl
Size 31.7 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64 abi3
SHA-256 checksum
How to use checksums
7d42429a58328e7ee9260809f47e166cfb44f3acb1fcd5e8eeb95be93f259588
BLAKE2b-256 checksum
How to use checksums
79e1fe2cf44b4b7218acbf6ef05dfe4dab92513123638aa55f52dc958d653a8e
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.dev266-cp312-abi3-manylinux_2_34_aarch64.whl

Download URL ernie_renderer-0.1.0.dev266-cp312-abi3-manylinux_2_34_aarch64.whl
Size 29.5 MB
Tags CPython 3.12 Linux glibc 2.34+ ARM64 abi3
SHA-256 checksum
How to use checksums
1a3b931da6805226f50c7bb18924fb7336e8748732e911da14338628fa17c8e3
BLAKE2b-256 checksum
How to use checksums
843f9b11517312e3cf9c5f3a4540ced8fa5de81f18b231f5dcab504f17c58578
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.dev266-cp312-abi3-macosx_11_0_arm64.whl

Download URL ernie_renderer-0.1.0.dev266-cp312-abi3-macosx_11_0_arm64.whl
Size 40.3 MB
Tags CPython 3.12 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
6a08dee598a236886e7ea01c00bb44883cc523c8deb42a45a7a80493850aeec3
BLAKE2b-256 checksum
How to use checksums
bbd761d929365330db95c0e26e3f95294be613de03aa1c6148a44498afa0f225
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.dev266 This release

5 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