feat(render): Campaign V slice V2b - terrain texture-index migration
Continues the V2a mesh-path conversion onto TerrainModernRenderer: its two per-pass bindless texture handles (the terrain atlas and the alpha-mask atlas) now travel as table indices instead of raw 64-bit ARB_bindless_texture handles, with zero pixel change. Terrain differs structurally from the mesh path: it has no per-batch SSBO at all, just two handles set once per draw as plain uniforms (terrain_modern.frag's uTerrainHandle/uAlphaHandle, reconstructed via the sampler2DArray(handle) macros uTerrain/uAlpha). So instead of a BatchData struct field, the two uniforms became uTextureIndexA/uTextureIndexB - named to match the pinned GpuPushConstants.TextureIndexA/B fields (campaign doc section 3.4) so V4d's eventual move to push constants is a rename, not a redesign. There is no push-constant plumbing yet, so these stay plain uniforms for now, set via ProgramUniform1 instead of ProgramUniform2. TerrainModernRenderer owns its own GlBindlessHandleTable and binding=9 SSBO (the same GL-only handle-table emulation V2a introduced), independent of WbDrawDispatcher's and EnvCellRenderer's - nothing requires index agreement between renderers, and terrain only ever registers two handles per draw (the atlas's terrain/alpha textures), so its table is dirty only once, on first draw. Unlike WbDrawDispatcher/EnvCellRenderer, TerrainModernRenderer already eagerly creates its other GL resources in the constructor with a ResourceCleanupGroup rollback, so the texture-table SSBO is created there too rather than lazily. TerrainAtlas needed no change: GetBindlessHandles() keeps returning the raw (ulong terrain, ulong alpha) pair unchanged - the table lookup is entirely a TerrainModernRenderer-side concern, added at the one draw-call site that already converts those handles into shader state. Shader-side: terrain_modern.frag's uTerrain/uAlpha macros now expand through common.glsl's ACDREAM_TEXTURE_HANDLE(idx) lookup; both terrain_modern.vert and .frag opted into the common.glsl preamble (Shader's includeCommonPreamble, introduced at V2a) so their SceneLighting UBO declarations could also pick up the ACDREAM_UBO_SET scaffolding macro - terrain_modern.vert doesn't touch the texture table itself, but sharing the same preamble across both stages of a technique is simpler to reason about than deciding per-stage. Gate: dotnet build -c Release green, dotnet test tests/AcDream.App.Tests -c Release green (3843 passed / 3 skipped, matching V2a), and tools/run-offline-pixel-gate.ps1 passed against the V2a commit's build with a 2.49e-05 differing-pixel fraction - within the documented ~33x same-commit noise margin. No divergence-register row: this introduces no retail behavior deviation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
d365476ebb
commit
1f1f6c088b
4 changed files with 106 additions and 19 deletions
|
|
@ -209,7 +209,8 @@ internal sealed class RetailWorldRenderCompositionFactory
|
|||
new(
|
||||
gl,
|
||||
Path.Combine(shadersDirectory, "terrain_modern.vert"),
|
||||
Path.Combine(shadersDirectory, "terrain_modern.frag"));
|
||||
Path.Combine(shadersDirectory, "terrain_modern.frag"),
|
||||
includeCommonPreamble: true);
|
||||
|
||||
public SceneLightingUboBinding CreateSceneLighting(GL gl) => new(gl);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue