Skip to content

Commit ebbd9b1

Browse files
TMHSDigitalclaude
andcommitted
fix(examples): redesign sky-texture-sun-elevation hero as a sky-lit obelisk diptych
The gallery review found the old hero broke Layer 1. The horizon band clipped to pure white under Standard, the frame was a hard split with a black void below the horizon, and the subject was a primitive cone. The still is now a sky study: a red-granite gnomon obelisk with a stepped limestone plinth, bronze collar and plaque, and a matte-gilt pyramidion. It stands on a brick-pattern plaza with a bronze meridian scale, and the ground runs to the horizon. The sky is the only light. Both panels use one Background Strength, so sun_elevation is the only variable between them: 8 deg is navy dusk with a horizon glow and a raked orange face, and 55 deg is blue midday with a short shadow. The render path now gates framing per panel through gallery_framing (exit 10) and gates clipped highlights under Standard (new exit 12, > 0.05 % of pixels). The committed still has zero clipped pixels. The check-only path is unchanged, and the sky_type, dust/aerosol and zenith-rise checks pass on 4.5.11, 5.1.2 and 5.2.1. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: TMHSDigital <154358121+TMHSDigital@users.noreply.github.com>
1 parent 15ba0a3 commit ebbd9b1

10 files changed

Lines changed: 754 additions & 262 deletions

File tree

‎README.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ byte images stay straight 8-bit. Also witnesses `EXR color_mode='RGB'` dropping
325325
</tr>
326326
<tr>
327327
<td width="46%" valign="middle">
328-
<a href="examples/sky-texture-sun-elevation/"><img src="examples/sky-texture-sun-elevation/preview.webp" alt="Sky texture sun elevation: pale glazed jar diptych on a dark floor — left panel low sun at 8 degrees, the jar dim twilight blue under a deep blue zenith, right panel high sun at 55 degrees, the jar bright under a pale daylight sky" /></a>
328+
<a href="examples/sky-texture-sun-elevation/"><img src="examples/sky-texture-sun-elevation/preview.webp" alt="Sky texture sun elevation: diptych of a red-granite obelisk on a paved plaza lit only by the sky — left panel sun at 8 degrees, navy dusk with an orange horizon glow and the obelisk face raked orange, right panel sun at 55 degrees, bright blue midday sky, sunlit paving and a short shadow" /></a>
329329
</td>
330330
<td valign="middle">
331331

@@ -336,7 +336,7 @@ code misses across 4.5 → 5.1. `sky_type` is `NISHITA` on 4.5 LTS and
336336
`MULTIPLE_SCATTERING` on 5.1 (`NISHITA` gone); `dust_density` exists only on 4.5
337337
(`aerosol_density` on 5.1). Two tiny Cycles EXR zenith probes assert
338338
`sun_elevation` 8° → 55° brightens zenith (rise **2.25x** / **1.50x**, gate ≥ 1.25).
339-
Gallery still is a dual-elevation diptych so the contract reads at thumbnail scale.
339+
Gallery still is a sky-lit obelisk diptych (8° dusk | 55° midday) so the contract reads at thumbnail scale.
340340

341341
</td>
342342
</tr>
21.7 KB
Loading
8.76 KB
Loading

‎docs/gallery/index.html‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ <h2><a href="custom-normals-shade/">custom-normals-shade</a></h2>
717717
</article>
718718
<article class="card" data-tags="world sky rendering">
719719
<a class="card-media" href="sky-texture-sun-elevation/" tabindex="-1" aria-hidden="true">
720-
<img src="assets/sky-texture-sun-elevation-hero.webp" alt="Split view of a pale glazed jar under a procedural sky: dim twilight blue at sun elevation 8 degrees on the left, bright daylight at 55 degrees on the right." loading="lazy" decoding="async" />
720+
<img src="assets/sky-texture-sun-elevation-hero.webp" alt="A red-granite obelisk on a paved plaza lit only by the sky: navy dusk with an orange horizon glow at sun elevation 8 degrees, bright blue midday and a short shadow at 55 degrees." loading="lazy" decoding="async" />
721721
</a>
722722
<div class="card-body">
723723
<h2><a href="sky-texture-sun-elevation/">sky-texture-sun-elevation</a></h2>

‎docs/gallery/sky-texture-sun-elevation/index.html‎

Lines changed: 360 additions & 122 deletions
Large diffs are not rendered by default.

‎examples/gallery.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@
460460
"name": "sky-texture-sun-elevation",
461461
"dir": "examples/sky-texture-sun-elevation",
462462
"teaches": "World ShaderNodeTexSky driving Background Color — the sky contract across 4.5 LTS and 5.1. sky_type is NISHITA on 4.5 and MULTIPLE_SCATTERING on 5.1 (NISHITA gone); dust_density exists only on 4.5 (aerosol_density on 5.1). Two tiny Cycles OPEN_EXR zenith probes prove sun_elevation 8 deg to 55 deg brightens zenith (rise 2.25x on 5.1.2, 1.50x on 4.5.11, gate >= 1.25).",
463-
"alt": "Split view of a pale glazed jar under a procedural sky: dim twilight blue at sun elevation 8 degrees on the left, bright daylight at 55 degrees on the right.",
463+
"alt": "A red-granite obelisk on a paved plaza lit only by the sky: navy dusk with an orange horizon glow at sun elevation 8 degrees, bright blue midday and a short shadow at 55 degrees.",
464464
"witnessesFix": "AI code still assigns sky_type='NISHITA' and dust_density on 5.1 — both are wrong (NISHITA removed; dust_density is AttributeError; use MULTIPLE_SCATTERING + aerosol_density). A near-black Background Strength alone is not a sky: Sky must link into Background Color. Elevation that does not brighten zenith fails the rise gate.",
465465
"hero": "docs/gallery/assets/sky-texture-sun-elevation-hero.webp",
466466
"preview": "examples/sky-texture-sun-elevation/preview.webp",

‎examples/gallery_framing.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@
6565
the scene the still actually renders from. Multi-scene examples (e.g.
6666
vse-cut-list, whose gallery still renders from a dedicated ``Bay`` scene
6767
while ``bpy.context.scene`` is the cut-list scene) must pass that scene
68-
and its camera explicitly. Examples whose subject IS the world or the
69-
atmosphere (sky-texture-sun-elevation) have no renderable hero for the
70-
matte to isolate — they do not call this helper.
68+
and its camera explicitly. World/sky contracts still stage a renderable
69+
hero for the matte: sky-texture-sun-elevation measures its gnomon obelisk
70+
in each diptych panel, with ground and plaza passed as stage.
7171
"""
7272
import os
7373
import sys

‎examples/sky-texture-sun-elevation/README.md‎

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
A runnable example that builds a World whose Background Color is driven by
44
`ShaderNodeTexSky`, then proves `sun_elevation` is load-bearing with two tiny
5-
Cycles EXR zenith probes — and stages a dual-elevation gallery diptych so the
6-
contract is visible at thumbnail scale.
5+
Cycles EXR zenith probes. The gallery still is a sky study: a red-granite
6+
gnomon obelisk on a paved plaza, lit by nothing but the sky, shown at both
7+
elevations side by side so the contract reads at thumbnail scale.
78

89
**What it witnesses:** the Sky Texture contract AI-generated lighting code most
910
often gets wrong across the 4.5 LTS → 5.1 window.
@@ -33,26 +34,40 @@ multiple scattering) but clears the same gate on both binaries.
3334

3435
## Stage deviation
3536

36-
World carries a Nishita / multiple-scattering Sky Texture instead of the
37-
default near-black Background — the contract *is* the sky. Gallery still is a
38-
dual-elevation diptych (8° | 55°) so failure (identical panels) is visible at
39-
thumbnail scale. Layer 1 still holds: `view_transform='Standard'`, designed
40-
materials, chosen camera, no helpers in frame.
41-
42-
The jar is pale glaze, and the studio key and fill only model its form
43-
(70 W and 10 W). With saturated terracotta and a 420 W key, the studio lights
44-
lit the jar and both panels looked the same: the sky, the thing under test,
45-
was not what lit it. Now the jar reads dim twilight blue under the 8° sun and
46-
bright under the 55° sun. Mean luma is about 0.35, above the dark-stage band,
47-
which is information under this deviation, not a failure.
48-
49-
## Framing deviation
50-
51-
The hero is the sky itself — a world contract, not an object on the stage.
52-
The silhouette matte can only measure the jar in each 640 px panel (about
53-
0.37 x / 0.49 y), so an out-of-band number would be a measurement artifact,
54-
not the composition. The diptych is not wired to `examples/gallery_framing.py`;
55-
the helper has no `deviation=` flag to report through.
37+
The World carries a Nishita / multiple-scattering Sky Texture instead of the
38+
default near-black Background, and there are no studio lights: the contract
39+
*is* the sky, so the sky's sun disc is the key and its dome is the fill. The
40+
still is a diptych, 8° | 55°, split by a dark 12 px rule, with one Background
41+
Strength (0.035) for both panels so `sun_elevation` is the only variable. If
42+
it did not take, the two panels would render identical.
43+
44+
What reads at a glance: at 8° a deep navy sky with a dusk glow on the left
45+
horizon, the obelisk's sun face raked orange, the plaza nearly dark and the
46+
shadow running long out of frame; at 55° a bright blue sky, a sunlit plaza,
47+
and a short shadow ending on the bronze meridian scale inlaid in the paving.
48+
The ground runs to the horizon, so there is no void below it.
49+
50+
Layer 1 still holds: `view_transform='Standard'`, designed materials (red
51+
granite, limestone, bronze, matte gilt, brick-pattern paving), a chosen 35 mm
52+
camera on a `TRACK_TO` aim, no helpers in frame. Standard does not compress
53+
highlights, so the render path fails with exit 12 if more than 0.05 % of the
54+
still clips to white. The committed still has zero clipped pixels. The
55+
pyramidion is matte gilt rather than metal: a metallic cap Fresnel-glinted
56+
the 55° sun to pure white at grazing angles, whatever its roughness. Mean
57+
luma is about 0.20, reported against the calibration set as information
58+
under this deviation.
59+
60+
The sky's `sun_rotation` is a compass bearing, measured clockwise from +Y.
61+
The first draft assumed the opposite convention and put the shadow on the
62+
wrong side. `_sun_rotation_for_shadow` holds the measured mapping.
63+
64+
## Framing
65+
66+
Each 640 × 720 panel is its own frame, and the gnomon is measured in it
67+
through `examples/gallery_framing.py` (exit 10). Both panels share geometry
68+
and camera, so one measurement covers both. On 5.2.1 the fill is
69+
x 0.566 / y 0.794 and the margins are left 0.100, right 0.334,
70+
bottom 0.044, top 0.161. The ground, plaza and meridian inlay are stage.
5671

5772
## Run
5873

@@ -63,7 +78,7 @@ blender --background --python sky_texture_sun_elevation.py --
6378
# Falsifier: Sky→Background unlinked. Must exit non-zero (world links).
6479
blender --background --python sky_texture_sun_elevation.py -- --unlink-sky
6580

66-
# Also render the gallery diptych (Cycles):
81+
# Also render the gallery diptych (Cycles; framing gate exit 10, clip gate exit 12):
6782
blender --background --python sky_texture_sun_elevation.py -- --output sky.png
6883
```
6984

@@ -84,7 +99,10 @@ against it.
8499
| 7 | High-elevation zenith luma below floor |
85100
| 8 | Zenith luma did not rise with elevation |
86101
| 9 | `--output` produced no file |
102+
| 10 | `--output` framing violation (`gallery_framing`, per panel) |
103+
| 12 | `--output` still clips to white under Standard (> 0.05 % of pixels) |
87104

88105
The `blender-smoke` workflow runs the check on Blender 5.2 LTS and 4.5 LTS
89106
(5.1 on the weekly cron, the `needs-5.1` PR label, or manual dispatch).
90-
Smoke does not pass `--output` or `--unlink-sky`.
107+
Smoke does not pass `--output` or `--unlink-sky`, so exits 10 and 12 are
108+
render-path only.
19.9 KB
Loading

0 commit comments

Comments
 (0)