LESS 3.0
GPU + CPU accelerated 3D radiative transfer model for remote sensing simulation
LESS 3.0 is a complete reimplementation of the LESS model — a widely-used 3D radiative transfer framework in quantitative remote sensing research. Built around NVIDIA OptiX, cross-vendor Vulkan Ray Query, Intel Embree, and a modern Python API, LESS 3.0 inherits the physical foundations of the original LESS while adding hardware acceleration, a redesigned scripting interface, and full physical coupling of energy balance, photosynthesis, and solar-induced chlorophyll fluorescence (SIF).
The original LESS remains available at lessrt.org. LESS 3.0 is the recommended path for new projects.
Key Features
- Three compute backends — OptiX is the high-performance NVIDIA path, Vulkan Ray Query provides experimental cross-vendor GPU coverage, and Embree supplies portable CPU workflows.
- Clean Python API — Designed for remote sensing scientists. Build a scene in 10 lines of code.
- Digital twin architecture — Build the scene once, simulate many times. Update illumination or surface properties without rebuilding geometry.
- Multi-sensor support — Optical, thermal infrared, LiDAR point cloud/waveform, SIF fluorescence, and passive/active microwave sensors.
- Full physical coupling — 3D radiation field → energy balance → photosynthesis → SIF, all tightly coupled to the Monte Carlo ray tracing engine.
- Interactive 3D viewer —
scene.show()opens a browser-based viewer to inspect the scene and preview simulation results.
Installation
pip install less3d
Pre-built wheels for Windows and Linux are provided for Python 3.10–3.13. No compiler, CUDA toolkit, or additional runtime installation required.
| CPU | Cross-vendor GPU | NVIDIA GPU | |
|---|---|---|---|
| Backend | Embree | Vulkan Ray Query | OptiX + CUDA |
| Hardware | Modern x86-64 | Vulkan 1.2 Ray Query GPU | Compatible NVIDIA GPU |
| Memory | System RAM | 4 GB+ VRAM recommended | 8 GB+ VRAM recommended |
| Best use | Portable core workflows | Portability and validation | Production Monte Carlo |
| Python | 3.10–3.13 | 3.10–3.13 | 3.10–3.13 |
Feature coverage differs by backend. Use
less.can_use("feature")orscene.can_use("feature")for the final answer in the current installation.
Backend feature matrix
OK means the workflow is implemented by a non-experimental backend.
Experimental means it is implemented and covered by cross-backend regression
tests, but the Vulkan backend is still being optimized and may be substantially
slower than OptiX. -- means that backend does not implement the workflow.
| User workflow | OptiX + CUDA | Vulkan Ray Query | Embree CPU |
|---|---|---|---|
| Optical imaging | OK | Experimental | OK |
| Thermal-infrared imaging | OK | Experimental | OK |
| Per-primitive thermal temperatures | OK | Experimental | -- |
| SIF imaging | OK | Experimental | -- |
| Directional BRF / albedo | OK | Experimental | OK |
| 3D radiation field / fPAR | OK | Experimental | OK |
| Irradiance maps | OK | Experimental | OK |
| LiDAR point cloud | OK | Experimental | OK |
| Full-waveform LiDAR | OK | Experimental | OK |
| Energy balance | OK | Experimental | -- |
| Per-primitive spectral radiation process | OK | Experimental | -- |
| Photosynthesis process | OK | Experimental | -- |
| SIF process | OK | Experimental | -- |
| Passive microwave brightness temperature | OK | Experimental | -- |
| Active microwave radar backscatter | OK | Experimental | -- |
| Dynamic instance updates | OK | Experimental | OK |
| Periodic / repetitive scenes | OK | Experimental | OK |
| Terrain-following sensing | OK | Experimental | OK |
The table describes code coverage, not the hardware in a particular computer. For the single user-facing answer on the current machine, call for example:
less.can_use("lidar_waveform", backend="vulkan")
scene.can_use("energy_balance")
On NVIDIA hardware, use OptiX for production simulations. Vulkan is currently intended for cross-vendor access, validation, and backend development; it is not yet a performance replacement for the CUDA kernels.
Quick Start
import less
# Create a 10 m × 10 m bare-soil scene
scene = less.Scene()
scene.size = 10.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.3))
scene.illumination = less.DirectDiffuse(sun_zenith=30, sun_azimuth=150)
scene.build()
# Simulate a nadir RGB image
image = scene.simulate(less.OpticalImager(
less.Orthographic(image_size=256),
bands=[650, 550, 450], # R, G, B (nm)
quality=128,
))
image.save("output.png")
Thanks to the digital twin architecture, updating scene parameters does not require a rebuild:
# Change sun angle and re-simulate — no rebuild needed
scene.illumination = less.DirectDiffuse(sun_zenith=60, sun_azimuth=90)
image2 = scene.simulate(sensor)
Simulation Capabilities
| Domain | What you can simulate |
|---|---|
| Optical | RGB, multispectral, and hyperspectral images; BRF / BRDF angular sampling; NDVI and vegetation indices |
| Thermal infrared | Per-component temperature scenes (sunlit/shaded leaf, soil, trunk); thermal radiance images |
| LiDAR | Airborne laser scanning (ALS) and terrestrial laser scanning (TLS) point clouds and full waveforms |
| Vegetation physiology | 3D PAR radiation field, full energy balance, photosynthesis, solar-induced chlorophyll fluorescence (SIF) imaging |
| Microwave | Passive H/V brightness temperature and active HH/HV/VH/VV radar backscatter, including vegetation and trunk-ground interactions |
Forest Scene Example
import less
import numpy as np
scene = less.Scene()
scene.size = 30.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.12))
scene.illumination = less.DirectDiffuse(sun_zenith=35, sun_azimuth=225)
# Broadleaf tree with PROSPECT leaf optical properties
birch = less.Object("birch", mesh="birch.obj")
birch.set_property("leaves", less.Prospect(cab=40, car=8, cw=0.012, cm=0.009, N=1.5))
# Random planting positions
xy = np.random.rand(50, 2) * 30
positions = np.c_[xy, np.zeros(50)]
scene.add(birch, positions=positions)
scene.build()
# Multispectral image (green, red, NIR)
image = scene.simulate(less.OpticalImager(
less.Orthographic(image_size=512),
bands=[550, 670, 800],
quality=256,
))
image.save("forest.tif") # GeoTIFF preserves physical radiance values
Built-in Examples and Viewer
import less
less.examples.list() # list all built-in scenes
less.examples.run("autumn_forest") # launch interactive viewer
less.examples.run("maize_field")
scene.show() # open 3D viewer in browser (Scene / Simulate / Products tabs)
Validation
LESS 3.0 is cross-validated against the original LESS on reference scenes:
| Scene | Description | Max RRMSE |
|---|---|---|
| Val01 | Lambertian ground | 0.02% |
| Val02 | Box canopy | 0.22% |
| Val03 | Ellipsoid forest | 0.83% |
| Val04 | Forest + diffuse sky | 2.17% |
| Val05 | PROSPECT-D leaves | 0.24% |
| Val06 | fPAR vs sun zenith angle | 0.62% |
| Val07 | Thermal IR | 0.17% |
Full validation reports are regenerated on each release. See tests/validation/.
Backend LiDAR throughput and CPU/GPU crossover can be reproduced with:
python benchmarks/benchmark_lidar_scaling.py
The benchmark reports fast point-cloud and full-waveform throughput at 1 thousand through 1 million pulses and checks numerical agreement against the Embree backend.
Documentation and Tutorials
Full documentation with step-by-step tutorials:
Topics covered: coordinate system · terrain and surface properties · illumination models · optical imaging · BRDF/BRF sampling · thermal infrared · LiDAR · energy balance · photosynthesis · SIF · visualization · scene serialization
Citing
If you use LESS 3.0 in your research, please cite the original LESS paper:
Qi, J., Xie, D., Yin, T., Yan, G., Gastellu-Etchegorry, J.P., Li, L., Zhang, W., Mu, X., Norford, L.K. (2019). LESS: LargE-Scale remote sensing data and image Simulation framework over heterogeneous 3D scenes. Remote Sensing of Environment, 221, 695–706.
Metadata
Release files for less3d 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| less3d-0.4.2-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| less3d-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| less3d-0.4.2-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| less3d-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| less3d-0.4.2-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| less3d-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| less3d-0.4.2-cp310-cp310-win_amd64.whl | CPython 3.10 | CPython 3.10 | Windows x86-64 | Details |
| less3d-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
Total release size: 271.1 MB
Release files / less3d-0.4.2-cp313-cp313-win_amd64.whl
| Download URL | less3d-0.4.2-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 18.7 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
42130abb7d9a17252b49367f4b75b96bac7ac04c3f7301c0aab759a43fed7e3e
|
|
BLAKE2b-256 checksum How to use checksums |
8d97ed76b003a4d966dd0f36105855e9c60e8ef02afc6e56c637356b25efca7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 49.0 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7513ef23298accdd70dedc2e66e24ccb117dece2df0666d28d7ca9b09d52907d
|
|
BLAKE2b-256 checksum How to use checksums |
d980b054f8a75304d3a43267fb1c7b94780edc1d552559f6e7e6c79230b3a7a1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp312-cp312-win_amd64.whl
| Download URL | less3d-0.4.2-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 18.7 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
f9b23a5c8248aa6ad9743316b5408dfabf582a806c69a2e1500b6521dcaf400d
|
|
BLAKE2b-256 checksum How to use checksums |
235f299d42ca40505957fbd6368928d02d658d237f9945bbfe693d9e2a0c70f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 49.0 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
ff085af3787aea5fba5c9d1aa0a5afd0dba04942b2a967eef04cab4b55c296c8
|
|
BLAKE2b-256 checksum How to use checksums |
a36592ab59d3e41191e0f0a31b17720e9b74fb67d831ebfe55f2766cafa2e533
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp311-cp311-win_amd64.whl
| Download URL | less3d-0.4.2-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 18.8 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9d8d91c643fdf204c38d36372208201abe5180abf7446b9fa25f5d3d5c1d4f30
|
|
BLAKE2b-256 checksum How to use checksums |
d41e0b1bda61723176938ffcdcf9eb87bf32960f6ecd453d87bc2d01eedd0fd0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 49.0 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
7457a7696d3252c6b324a5cb874df79414ff28c90bcedb58f61c8aeb76f76c3b
|
|
BLAKE2b-256 checksum How to use checksums |
ba927c9b12d763f7baaa464fc9953f30e87433ff7347320b834c8cf512105b13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp310-cp310-win_amd64.whl
| Download URL | less3d-0.4.2-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 18.8 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
b518df06575826ee1273218ac04f118a031b0a036d2ddc5749b103a96e55af14
|
|
BLAKE2b-256 checksum How to use checksums |
a4e6b58041cc3e54f52dc19f5f63d4fcb5fd86b79b93ad4f2fe6edebcc9b33d3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / less3d-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 49.0 MB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
1a2a088c9ca31df86b1afcd5ea54b51fe5845218e446e3da26ff04f8f5268f74
|
|
BLAKE2b-256 checksum How to use checksums |
d6dd90e4948b3e273aee01c5112907c09e6f71041c7fe4dcd034e810efd3dd0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|