Summer meadow preparation and distant forest proposal
Prepared 2026-09-15 during the native albedo diagnostic build. Only ArtSource and this document changed. Nothing was imported into Unity; no runtime material, terrain, route or build changed.
Prepared source
ArtSource/Alps/SummerMeadow/Exports/ contains the proposed AlpineSummerMeadow colour, OpenGL normal, roughness, AO and technical HDRP mask. prepare.py beside it reproduces the output and checks publisher hashes against the already verified candidate manifest. manifest.json records every original/output hash, size, scalar-channel mapping and import contract.
Selected ambientCG Grass005, original archive, under CC0-1.0. The publisher describes its technique as Procedural with Bitmap Elements. It is not presented here as photogrammetry. The darker Grass001, technique Procedural, remains the comparison candidate for shaded roadside ground.
The selection follows the actual source pixels: the current AlpineMeadow is mostly dry brown leaf litter interspersed with green leaves. Grass005 has continuous fresh blades and better matches the user's green summer valley photographs. The current source, Grass005 original, and prepared byte-identical Grass005 colour were viewed directly. The prepared output has no artistic colour transform, contrast adjustment, gamma correction, resampling or recompression.
| Source | Mean sRGB RGB, 0–255 | Mean linear luminance |
|---|---|---|
| Existing AlpineMeadow | 151.02 / 131.34 / 89.12 | 0.24413 |
| Grass001 comparison | 68.14 / 91.52 / 40.34 | 0.09249 |
| Prepared Grass005 | 101.45 / 131.84 / 43.64 | 0.19928 |
An initial 1.4 × 1.4m authored tile size places the blades within the requested 1–2m range. Grass005's publisher page did not supply a physical size; this number is an authored starting scale, not a measured publisher claim. Final scale remains subject to the riding-camera view. At 1024² it corresponds to about 1.37mm per source texel.
Colour, normal, AO and roughness are unchanged file copies. The mask is losslessly packed as R=0 nonmetal, G=source AO, B=255 detail coverage, A=255−source roughness. Exact channel roundtrip was verified. Unity import contract: sRGB colour only; NormalMap with the original OpenGL orientation; linear mask; Repeat and mipmaps. A white material multiplier and no extra gamma conversion preserve the source. Smoothness remap 0–1 preserves the source roughness instead of silently crushing it into a narrow hand-chosen range.
- Colour SHA-256:
5fd8edc1a04e2b9b093229dd0ec41f29668dda9fc698f6610b12cdd83b7690cb - Mask SHA-256:
218e7f1f8f673d1243d5f05dae434921ff5bf3d093096d0b35866ae35925611b - Complete hashes:
ArtSource/Alps/SummerMeadow/manifest.json
Use the new material name only for Alpine summer meadow Layer 0 initially. Do not overwrite the existing source shared by other regions. This preparation addresses unsuitable source colour; it does not establish that the native material pipeline or final image has passed.
Smallest distant-canopy correction to test next
The current woodland Layer 1 repeats the brown ForestGround litter photograph over entire far mountain slopes. AlpineForestCanopy adds 15-tree cross-card groups beyond 700m, while those groups cast no distant ground shadows. Consequently the native view shows detached stamps with bright exposed floor between them. More cards alone will retain the wrong broad-scale colour and the same repetitive silhouette.
Proposed bounded summer M1 experiment, after the native albedo diagnosis:
- Use the existing
HDRP/LayeredLitfourth slot as a geographic far canopy layer. Summer currently has only three active layers. Use the existing attributed orthophoto as its planar albedo at the exact same world scale/offset as Layer 2. No tint, no floor normal map, no new custom shader, no additional texture asset. Keep the original Repeat sampler in Layer 0. - Replace the currently unused summer mask B channel (an archived coarse-rock weight) with
forest * (1 - rock) * smoothstep(220m, 650m, nearestRoadDistance). Derive distance from the immutable sampled lines of all three Alpine routes, so the same patch does not change with the selected stage. The narrow road corridor and near soil remain readable. Restrict coverage to verified tree-covered orthophoto regions; procedural woodland coverage alone can include real aerial clearings or buildings. This is a source-mask preparation with unchanged DEM, mesh and physics. - First take the same three native M1 frames without changing tree count or card geometry. This isolates whether coherent photographic crown colour removes the bright detached-stamp effect. Inspect albedo mode as well as lit output. Only after this comparison consider reducing the large card groups where they duplicate visible photographic crown texture; retain skyline and close individual silhouettes.
This uses the retained native four-layer shader path already needed by the snow material. It adds a texture sample and a mask update, not thousands of extra objects. It must not switch entire 512m terrain tiles between near/far materials, which would create hard boundaries.
The existing winter material already reserves slot 3 and mask B for snow. Therefore this is explicitly a limited M1/M2 test, not a silent replacement of snow or a claimed all-season solution. A successful summer result would justify the separate next decision about winter canopy representation. The orthophoto also retains baked lighting and shadows; it cannot supply close 3D branches or parallax and is not a de-lit PBR canopy asset. Native acceptance must show coherent green forest masses, no pale perforations or terrain seams, retained close trunks/understory and unchanged rocky/tree-line boundaries.
Integration after native albedo diagnostic
Root subsequently authorized integration while keeping the DEM and both landcover masks unchanged. The four-layer proposal above was therefore not implemented. The smaller actual correction is:
- Alpine summer Layer 0 now loads the new Grass005 colour, normal and mask at 1.4m, with white albedo and source-preserving smoothness remap. Only three runtime textures were copied into
Assets/Rampage/Resources/Textures; the source AO and roughness remain outside Assets. - Summer woodland Layer 1 now uses the existing geographic orthophoto in place of the repeating brown forest-floor photograph. Its unchanged R mask selects coverage. Planar scale/offset exactly match the existing geology layer. Floor normal/mask maps were removed from that layer because their original small-scale UVs would not be valid with geographic mapping.
- No increase in tree count, no card geometry change, no mesh/physics/DEM change, no mask edit. The same woodland layer also reaches some near ground; native review must check this limitation. Winter keeps its prior four-layer setup pending separate winter review.
The actual input comparison used all four images view0/1-albedo.png and view0/1-original.png in Docs/QA/20260915-161917-campaign/albedo-diagnostic/. Their albedo output confirms that the beige ground is present before scene lighting.
Massif: numerical mip and coverage diagnosis
ArtSource/Alps/SummerMeadow/check_native_ortho.py reconstructs rays from the captured camera projection/quaternion, intersects the immutable DEM bilinearly on CPU and samples the original orthophoto and mask. native-ortho-samples.json records the results. This is an approximate check: runtime terrain uses sampled triangles, and some screen pixels can hit foreground tree cards first. It does not claim exact per-fragment GPU tracing.
At selected exposed massif points, estimated orthophoto derivatives imply mip levels 0.45–1.42, not catastrophic downsampling. The source sRGB and native albedo closely agree where rock coverage is full: view1 pixel (810,165), world (-2564.54,1357.72,3463.04), G=255, source RGB (149.31,139.64,135.64), native (157,146,141). Minor differences are consistent with actual filtering, shader detail and triangle approximation. No concrete mip or planar-coordinate error was established, so there is no unsupported sharpening/mip-bias change.
The creamy smooth lower massif is principally a landcover classification problem. Examples:
| Native point | DEM local height | Rock mask G / 255 | Original aerial RGB | Native albedo RGB |
|---|---|---|---|---|
| view0 (915,245) | 1037.06m | 5.97 | 87.20 / 80.47 / 86.30 | 148 / 129 / 90 |
| view1 (910,219) | 1056.60m | 5.93 | 56.55 / 46.06 / 56.23 | 150 / 131 / 90 |
| view1 (1025,250) | 1018.21m | 95.85 | 48.91 / 44.95 / 43.90 | 127 / 110 / 77 |
At the first two points the original orthophoto is almost completely masked out; the repeated meadow photograph supplies the beige colour instead. Woodland fades near 835–1060m local height, while altitude-driven rock does not become substantial until 1030–1330m, and the slope term misses some genuine exposed faces. This leaves a wide meadow belt beneath the limestone. Grass005 will make that belt greener, but this alone cannot restore the real source's geological boundaries. The geographic mask remains unchanged as requested; these samples support a subsequent specifically scoped landcover correction rather than blind rock recolouring.
Preserved SHA-256 values:
- DEM:
7f3fc34b74dc07448e973b7f9510f5a4898294fa811c4468eeff3865d6ed1414 - Summer mask:
3010b1e66fed9de2da8f8ba9ef3a512ed61454206652bed0c2124a9b68af483e - Snow mask:
164727a3cbe64560eea1d9a89abd5566401fab9a37e6e28cf801f7bd162cd982
Native art acceptance of this integration is pending.
Authorized geographic geology correction
Root authorized the specifically evidenced landcover correction after reading the native ray measurements. Tools/Art/refine_alpine_geology.py now refines only G in both summer and winter masks. Originals are hash-verified under ArtSource/Alps/SourceAssets/LandcoverBaseline; the complete numerical report is ArtSource/Alps/geology-refinement.json.
The correction is limited to the actual main massif with a feathered geographic boundary, local heights 740–990m as a transition gate, DEM slopes around 24–40 degrees or steeper, and low green chromatic evidence in the original aerial pixels. This accounts for genuine steep faces softened by the 20m DEM. It does not classify bright pixels as snow. Original aerial colour remains unchanged. Gentle plateau areas and green vegetation do not receive the additional rock weight. No height or route sample changes.
| Native ray point | Ground slope | Before G / 255 | After G / 255 |
|---|---|---|---|
| view0 (915,245) | 43.83° | 5.97 | 255.00 |
| view1 (910,219) | 40.55° | 5.93 | 255.00 |
| view1 (1025,250) | 53.60° | 95.86 | 252.70 |
| Low green forest control: view0 (410,275) | 44.13° | 0.22 | 0.22 |
Both masks change 158,106 of 4,194,304 pixels (3.7695% of the map), only in G. Mean G increase across the full map is 3.38472/255; maximum 255/255. R forest coverage, B snow/reserved coverage and A remain byte-identical, checked directly. In particular, winter snow distribution is unchanged while its underlying geology agrees with summer.
- Revised summer mask SHA-256:
3910ade3774e2dd26e7db40071c6e8b41c01cb89808f29e3d1bab065c866a341 - Revised winter mask SHA-256:
ce576c652446466f12718966ec2adb82a052b184388c7c56ef7c5b0b5ffdb53a - DEM still:
7f3fc34b74dc07448e973b7f9510f5a4898294fa811c4468eeff3865d6ed1414
User reference 13 (codex-clipboard-eb1e0d45-5021-409b-9399-f143f651b50f.png) was viewed again during this correction. Its grey rocky drainage faces continue down into the woodland; it does not support the former uniformly beige belt at an arbitrary height. Aerial chromatic classification remains imperfect in deep shadows, and the limited mask operation cannot improve actual terrain mesh resolution. The next true Windows frame remains the artistic decision point.
Null-device material readback guard
Docs/QA/20260915-164245-campaign/campaign-report.json records a headless load failure with zero frames: Unity's Null graphics device returned null from material _BaseColorMap0 readback, causing the rendering-sampler assertion to abort stage creation. This is distinct from the earlier successful rendered albedo diagnostics.
AlpineTerrainMaterial.Create now performs that material readback, Repeat import assertion, texture-dimension and keyword reporting only when SystemInfo.graphicsDeviceType != GraphicsDeviceType.Null. Resource loading, missing-resource checks and the actual material setup remain unchanged. The Null branch explicitly logs that renderer-property checks were skipped and no graphics validation occurred. No replacement material or physics shortcut was added. The full compile initially encountered concurrent unfinished RiderRig changes (RaisedPanel/AddLimbFolds), outside this fix; native headless rerun and final compile remain root-coordinated.