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.1
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.1-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| less3d-0.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| less3d-0.4.1-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| less3d-0.4.1-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.1-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| less3d-0.4.1-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.1-cp310-cp310-win_amd64.whl | CPython 3.10 | CPython 3.10 | Windows x86-64 | Details |
| less3d-0.4.1-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: 270.5 MB
Release files / less3d-0.4.1-cp313-cp313-win_amd64.whl
| Download URL | less3d-0.4.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 18.7 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8ab0295b70e97d298b80fe9c4ada7f4a12d066df32abd16bbaf526d0bd5c7058
|
|
BLAKE2b-256 checksum How to use checksums |
5dd2b6522b88638411864883c18f02a2fb4e042d4055bbb54c36fade0f4a9885
|
| 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.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 48.9 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
1c6f0a05f120276e7b77fa769c4e5bda1a47a81c6a2e60bff475be1282aad807
|
|
BLAKE2b-256 checksum How to use checksums |
c1af8bd42309d45f6836adee5218f730a700080a2112b4a1307a71dc22489487
|
| 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.1-cp312-cp312-win_amd64.whl
| Download URL | less3d-0.4.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 18.7 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
8159b4abbaa683e5e079a51a9f2f411fe94f6c885a8243ea488658594332d250
|
|
BLAKE2b-256 checksum How to use checksums |
dc8e60bc1d76b06932cab0d2764196b7df597212c2756d2fe4531c9464ef3924
|
| 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.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 48.9 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
bcee18b5fb951e89038c643e72845898557bf1b68503a9f40f660f606b7cb7d1
|
|
BLAKE2b-256 checksum How to use checksums |
97422a6e45352fb823cecade4f81c7e1ec55ee95b578d49b9766c80fe14fd9a1
|
| 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.1-cp311-cp311-win_amd64.whl
| Download URL | less3d-0.4.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 18.7 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
530be764819d04c5470ad42afb38906f7d13d1070ff29e83d577e2dbca482edf
|
|
BLAKE2b-256 checksum How to use checksums |
2ee23a2c04ff44b6f35f80c915bb0b585810f7bf84384bde4f0d7747fb6d9da7
|
| 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.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 48.9 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
a0d03f9560de529782cdf97a07d81c49cd9754d90c3b1fa2e52de35e5f8192ff
|
|
BLAKE2b-256 checksum How to use checksums |
3775b3156270865584ccdb235493bbecfefc8f629491793840727644e51b831e
|
| 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.1-cp310-cp310-win_amd64.whl
| Download URL | less3d-0.4.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 18.7 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ccb40f27b6ac9a02051eecb2ca2729eee9ed9fe5570088edab52929afcfca715
|
|
BLAKE2b-256 checksum How to use checksums |
e0eb8c9bfaf24a59ef0195eaa562310a4b027bbd187fe616089759d585dfb3bd
|
| 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.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | less3d-0.4.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 48.9 MB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
e047f8863bcc0499ac44329e2329f8c6c109b3729c7c3532f73aa40d47a06a1f
|
|
BLAKE2b-256 checksum How to use checksums |
7a4265f3de96576c06c9cf6d511457d1e4182f24996296ba03f82b4256f5ad10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|