Our pictures next to real photos of the Moon

We draw a patch of the south pole under the exact Sun of a real photo taken by NASA's Lunar Reconnaissance Orbiter, then compare the two. Drag the slider to see for yourself.

Shackleton–de Gerlache ridge, 1 km: LROC NAC photo
Shackleton–de Gerlache ridge, 1 km: Rendered
RenderedLROC NAC photo

About 1 km across · drag to compare · photo credit: NASA/GSFC/Arizona State University

What we found

Passes all three checks
  • Large landforms match. Fine surface texture does not, because NASA's terrain data is coarser than the photo.
  • Brightness matches the real photo closely.
  • The main shadows line up. Their edges differ, because a Sun this low casts soft shadow edges.

Tested at one site under one Sun so far. More sites and lighting are next, and every custom dataset ships with its own comparison.

Request a dataset for your site
How we knowthe scores, the photo, the render settings and the method

The three scores

Structural similarity (SSIM)

0.275
0≥ 0.2 required · pass1

How much of the photo's local structure the render reproduces, 7×7 window on a common stretch. 1 is identical. Limited by real sub-5 m texture the DEM cannot contain.

Brightness histogram distance (EMD, I/F)

0.00092
0≤ 0.001 required · pass0.002

Earth mover's distance between the render's and the photo's brightness distributions, after scaling the photo so the sunlit means match. 0 is identical; measures shape, not absolute level.

Shadow-mask overlap (IoU)

0.235
0≥ 0.2 required · pass1

Intersection over union of the geometric shadow label and the shadow seen in the photo. Shadows are small here, so this is a regression guard rather than a quality score.

These are the renderer's own numbers from its first honest run; the thresholds were set from that run and may only get stricter. Thresholds: services/renderer/validation/thresholds.yaml. Valid pixels: 39,102 of 40,000.

The photograph

Source image
M139797542L
Taken
2010-09-22 12:24 UTC
Incidence
88.55°
Emission
1.69°
Phase
88.79°

Angles are for the centre of the full NAC frame; the render uses the Sun computed with SPICE at this tile.

The render

Sun
144.1° SE, 1.17° up
Sun from
SPICE (LT+S)
Sun disk
0.53°
Albedo
0.2
Samples
64 per pixel
Engine
Cycles, Blender 4.0.2

The terrain

Elevation
LOLA 5 m/px
Horizons
LOLA, 80 km context
Shadow (geometry)
542 px
Photo no-data
898 px

Where the shadows agree

The shadow label is computed from geometry alone: a horizon march across 80 km of terrain with the Sun as a 0.53° disk. The photo's shadow is every pixel darker than half the sunlit median, plus pixels the NAC stereo pipeline could not map (it fails in deep shadow). The overlap of the two is the IoU above.

  • Shadow in both437 px1.09%
  • Shadow in the label only105 px0.26%
  • Shadow in the photo only1,321 px3.30%

Most disagreement is shadow seen only in the photo: 898 of those pixels are holes the stereo pipeline left, and the rest sit around shadow edges, where a half-degree Sun 1.2° above the horizon casts a wide penumbra that the label must call yes or no. Shadows cover only about 1.4% of this tile at this time, so one site and one Sun is a regression guard, not a verdict on realism.

Shadow agreement map

What the numbers mean, honestly

The brightness distribution is right once the photo's unknown calibration scale is removed (the photo is scaled so the sunlit means match). That does not validate the absolute albedo of 0.2; that needs a calibrated reflectance image, which is next.

SSIM of 0.27 is low in absolute terms, and expected: the elevation model is interpolated from laser altimeter tracks (effective resolution of tens of metres) while the photo has real texture at every scale. It measures how much of the photo's structure a terrain-only render carries, which is the right number to publish next to a dataset.

Not covered yet: perspective cameras, albedo variation, the synthetic fine-detail texture (off for this comparison), the Hapke model, other Sun azimuths and other sites.

Method and review: the full report is renderer-validation-shackrdge02-2026-10-11.md, and the method is in render-validation.md.