Paired native albedo diagnosis
-rampageAlbedoQA is an explicit diagnostic-only addition to CampaignQA. It requires both -rampageCampaignQA and -rampageTest, the isolated QA application/profile, actual HDRP rendering and screenshots. No UI, app, bike, material, light, route or Rigidbody implementation is changed by the capture helper. Ordinary campaign runs without this flag retain ordinary screenshots.
Why a separate build is required
The installed package is HDRP 17.3.0, cache 700710090fa9. Its public APIs are:
HDRenderPipeline.debugDisplaySettings
DebugDisplaySettings.SetDebugViewCommonMaterialProperty(
UnityEngine.Rendering.HighDefinition.Attributes.MaterialSharedProperty.Albedo)
HDRPBuildData.cs computes debug stripping as !isDevelopmentBuild || ShaderStrippingSetting.stripRuntimeDebugShaders. HDRPPreprocessShaders.cs removes DEBUG_DISPLAY variants when stripped unless runtime AOV support was explicitly enabled. The production HDRP asset has supportRuntimeAOVAPI: 0. Therefore this helper refuses a Release player or a player reporting stripped debug shaders; it does not produce misleading normal images and label them albedo.
The separate AlbedoDiagnosticBuild.Run editor entry point creates a Development Build at Builds/Diagnostics/Albedo/Rampage.exe, temporarily sets stripRuntimeDebugShaders=false, and restores the production settings in finally. The regular Windows release path/settings remain separate. Tools/campaign-test.ps1 -DiagnosticAlbedo selects that build and records its actual assembly hash.
No private HDRP reflection is used in the runtime implementation. The offline proof records hashes of the exact installed API and shader-stripper sources.
Capture positions and state
The run is bounded to one selected stage, one pass and three image pairs. Default diagnostic stage/pass are alps-01/1; explicit incompatible stage/pass counts fail. Normal campaign setup still records unlock seeding and preserves production profiles in campaign-report.json.
At 6%, 48% and 85% of actual verified driving distance, the helper waits for the production frame to finish. It records the current MainCamera position, rotation, FOV, near/far planes, projection matrix and framebuffer dimensions, plus actual body position/velocity and race distance/time. It uses no reconstructed or invented photo pose.
For that pair only, simulation time is set to zero and the existing RideCamera/CinemachineBrain are disabled. No Rigidbody position, rotation, velocity, collision state or material/light property is assigned. The completed normal framebuffer is saved, the HDRP shared Albedo view is enabled, and three real MainCamera renders are awaited before the albedo framebuffer is saved. The helper rejects camera/frustum/dimension drift, body movement, absent material-debug state, fewer than three rendered frames or byte-identical images.
The returned Albedo view is HDRP's material-property diagnostic, with HDRP's usual removal of lighting-dependent postprocessing/exposure. It is not a separately graded beauty render. Custom shader coverage still requires image inspection; different hashes alone do not prove every visible shader supports albedo debugging.
All changes are inside try/finally. The original complete MaterialDebugSettings object is retained untouched and restored by reference, preserving private buffers and indices. A temporary debug object receives Albedo. The three public exclusive modes touched by HDRP's setter—fullscreen, lighting-debug mode and mip-debug mode—are restored exactly. Driver enable states and time scale are restored, and the render callback is removed. Screenshot textures are destroyed in their own finally.
CampaignQA now disposes nested enumerators on failure so their capture finally blocks execute. Helper disposal in Finish/disable/destroy supplies an additional cleanup path. A hard process/OS termination cannot run managed cleanup; such an incomplete report is not a successful diagnosis.
Files and interpretation
Each run writes a separate albedo-diagnostic/ directory, for example:
alps-01-pass0-view0-original.png
alps-01-pass0-view0-albedo.png
alps-01-pass0-view1-original.png
alps-01-pass0-view1-albedo.png
alps-01-pass0-view2-original.png
alps-01-pass0-view2-albedo.png
albedo-diagnostic-report.json
The report explicitly declares diagnosticOnly=true, performanceAcceptance=false, artAcceptance=false, and links the campaign setup report. Each pair includes PNG SHA-256 values, camera metadata, material-debug indices, actual rendered-frame count and pause duration. The required structural flags are cameraMatched, bodyUnchanged, materialDebugActive, debugRestored, cameraDriversRestored, timeScaleRestored and filesDiffer; all must be true. Pair status remains visual interpretation pending even when acquisition succeeds. The enclosing campaign report also marks that diagnostic pauses invalidate uninterrupted-driving/FPS acceptance.
Use a rendered solo run for the intended ground/forest/mountain material comparison:
& 'Tools/campaign-test.ps1' -DiagnosticAlbedo -Stages 'alps-01' -Passes 1 -Solo -GraphicsApi Direct3D11 -DeviceIndex 1
The device index is the already-used local Intel diagnostic adapter selection; the runner records the actual renderer/device. Root serializes editor/player execution. A complete native result still needs the correct device, six readable images, three valid pairs, profile integrity, clean process exit and subsequent visual comparison of ground, forest floor and limestone.
Offline evidence
albedo-capture-offline.json: 28/28 checks, zero failures. These execute the compiled opt-in truth table, exact flag matching, same-camera/frustum/dimension predicates including nonfinite rejection, and inspect the installed public API contract. Runtime 90 and Editor 20 files compiled without warnings/errors at this source checkpoint. These offline checks did not establish framebuffer or art quality; the subsequent native acquisition is recorded below.
Reproduce the offline check with Tools/Verification/verify-albedo-capture.ps1.
Native acquisition: PASS, 15 September 2026
Evidence: invocation, paired diagnostic report, and campaign setup/results. The run started at 16:19:17 Europe/Vienna (14:19:17Z), with the report created at 14:19:29Z. It rendered on Intel UHD Graphics, Direct3D11, 1920 × 1080, using the explicit solo/albedo/test flags and device index 1. Exit code was 0, production profiles were unchanged, and the invocation recorded no driver events or error.
Build identity: Rampage 0.1.0, Unity 6000.3.24f1, HDRP 17.3.0 / 700710090fa9; Development Build GUID 4a3f58cf26c14a77bd68374d0e167a4c. Invocation SHA-256 and the independently checked diagnostic Assembly-CSharp.dll both equal E0063B07F917218E8E23409E143486782940E757F5A3F62B4221E8CF3841800F. The separate diagnostic build manifest, dated 14:03:31Z, records success, retained debug shaders and restored stripping settings. This identifies the diagnostic build, not a new release build.
| Pair | Verified distance | Race time | Diagnostic pause | Albedo frames |
|---|---|---|---|---|
| view0 | 218.353 m | 6.508 s | 3.048 s | 3 |
| view1 | 1742.385 m | 35.034 s | 2.405 s | 3 |
| view2 | 3082.614 m | 61.443 s | 0.756 s | 3 |
All three pairs have identical camera/frustum/framebuffer metadata and zero body position, rotation and velocity deltas. cameraMatched, bodyUnchanged, materialDebugActive, debugRestored, cameraDriversRestored, timeScaleRestored and filesDiffer are true for each pair. All six PNG SHA-256 values were independently recomputed and match the report. The helper reports disposed=true; Development Build and retained-debug-shader guards are true.
The enclosing isolated campaign setup lists no seeded stages and reports a completed Alps 1-1 solo route, zero crashes/recoveries/missed-checkpoint frames, stable dimensions and no errors. The diagnostic pauses explicitly exclude this run from uninterrupted-driving or FPS acceptance. diagnosticOnly=true, artAcceptance=false and performanceAcceptance=false remain the controlling scope; raw pair statuses are retained unchanged.
Visual interpretation of view0 and view1
Both original/albedo pairs were viewed at their native 1920 × 1080 dimensions:
- view0 original / view0 albedo: the meadow remains yellow-brown/beige in albedo, with a repeated fine pattern rather than the green summer meadow in the user's reference. Lighting makes it paler, but cannot explain the underlying brown material. Asphalt is neutral grey in both views.
- view1 original / view1 albedo: the forest floor remains brown and largely bare. Distant slopes read as separated dark tree clusters on that same brown ground; the photograph's continuous green foothill cover is missing. The diagnosis therefore requires ground/landcover work as well as any lighting review.
- Pale, smooth ridge areas and high-contrast streaking remain visible in both pairs. These images establish a visible material/landcover problem, but do not alone distinguish mountain texture resolution, UV scale, mesh shape and normal-map contributions. The mountain audit is separate. Albedo debugging intentionally produces a black sky and does not diagnose sky appearance.
Result: native diagnostic acquisition passed; the images demonstrate remaining visual defects. This is not graphics or AAA acceptance.