resolved
Renders what a spacecraft camera sees: Earth, Moon, Sun and a target spacecraft loaded from a mesh. The inputs are an epoch, the observer and target states and attitudes, and a camera model. Images are radiometric: the renderer works in radiance and converts to electrons and then DN through the camera's optics and detector, so an image should match what a real camera with the same parameters records.
It is built for closed-loop simulation, where each step renders one frame and latency is the number that matters. The target is 1–2 MP RGB in under 100 ms end to end on a mid-range GPU (the reference is an RTX 3060). Lighting fidelity and camera fidelity are selected separately, and each tier is benchmarked, so a run can trade fidelity for speed knowing what each step costs.
Rendering goes through wgpu. On a machine without a GPU, the same shaders run
on the CPU through Mesa's lavapipe (vulkan-swrast on Arch,
mesa-vulkan-drivers on Debian and Ubuntu).
Status
Early development. Nothing renders yet. The work is tracked as Gitea milestones, each split into one issue per change:
| Milestone | Scope |
|---|---|
| M1 | Scene API, headless wgpu, analytic Earth/Moon/Sun, glTF and STL targets, Lambert shading with eclipse, pinhole camera, radiance to DN, CLI, benchmark baseline |
| M2 | Self-shadowing, Earthshine and Moonshine, Earth and Moon albedo maps, Sun limb darkening |
| M3 | Lens distortion, PSF, detector noise, saturation and blooming, stars |
| M4 | BRDF and spectral materials, atmospheric scattering, clouds, lunar terrain |
| M5 | Portable ray tracing, path tracing, label outputs for ML |
| M6 | Validation against lunar, Earth and Mitsuba references; motion blur, rolling shutter, stray light; multi-band and 4k |
Conventions
- SI units throughout: meters, seconds, radians, watts.
- Scene state is f64 in an inertial frame (GCRF). The GPU only sees f32 coordinates relative to the camera.
Layout
crates/resolved: the library.crates/resolved-cli: theresolvedcommand, for rendering without writing a host program.docs/optics.md: the optics and radiometry the renderer models, explained for readers without an optics background.
Development
Point git at the committed hooks once per clone:
git config core.hooksPath hooks
pre-commit runs formatting, clippy and the library unit tests; pre-push
runs the full test suite, including doctests, and the documentation build.
The integration tests render on both a hardware GPU and lavapipe, so running
them needs a Vulkan driver for the GPU and lavapipe installed. Set
WGPU_BACKEND, WGPU_ADAPTER_NAME and the other standard wgpu environment
variables to steer adapter discovery.
To see what the GPU tests render, set RESOLVED_TEST_IMAGES=1. Each test then
writes a PNG per device to target/tmp/test-images/, scaled so a white
surface facing the Sun is full white:
RESOLVED_TEST_IMAGES=1 cargo test --test bodies --test mesh
License
MIT