fix(N.5b): black terrain — switch to uvec2 handle + sampler constructor
Symptom: terrain renders pure black in modern path (legacy renderer correct). Diagnostic at TerrainModernRenderer.Draw showed: glProgramUniformHandle(prog=4, loc=5, handle=0x100251xxx) → GL_INVALID_OPERATION (0x0502) on both terrain and alpha sampler uniforms. Root cause: the `uniform sampler2DArray` + glProgramUniformHandleARB combination is rejected by the NVIDIA Windows driver in this configuration. The handle is valid and resident; the uniform location is valid; the program is valid; but the driver refuses to bind a 64-bit handle to a sampler uniform via the program-uniform path. Fix: switch to N.5's mesh_modern pattern — pass each 64-bit handle as a `uniform uvec2` (low + high 32-bit halves) and construct the sampler at the use site via the GLSL `sampler2DArray(handle)` constructor. This form is what ARB_bindless_texture documents as universally supported and is what N.5 already uses successfully. Files: - terrain_modern.frag: replace `uniform sampler2DArray uTerrain/uAlpha` with `uniform uvec2 uTerrainHandle/uAlphaHandle` + `#define`s - TerrainModernRenderer.cs: cache uvec2 uniform locations; set via `glProgramUniform2(program, loc, low32, high32)` per frame - BindlessSupport.cs: remove now-unused `SetSamplerHandleUniform`, leave a comment noting why the helper was retired - GameWindow.cs: also strip the temporary [TERRAIN-DBG] cursor-wrap print added during the perf-baseline investigation Build green; 114/114 tests in N.5+N.5b filter still pass; user-verified terrain renders correctly in modern path post-fix. Captured fresh perf baseline: - Legacy: cpu_us median 1.5 / p95 3.0 (1 chunk = 1 glDrawElements) - Modern: cpu_us median 6.4-7.0 / p95 9-14 (51 visible LBs, 1 MDI call) Modern is ~4× slower on CPU at radius=5 because the chunked legacy path already collapsed the scene to one draw call. The architectural wins (zero glBindTexture/frame; constant-cost dispatch as A.5 raises radius) will be documented in T10's perf baseline doc; the spec's "≥10% lower CPU" acceptance criterion is invalid at radius=5 and needs revision. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
55e516c538
commit
da56063be5
4 changed files with 45 additions and 23 deletions
|
|
@ -3,8 +3,16 @@
|
|||
|
||||
// Phase N.5b: terrain fragment shader on the modern bindless dispatcher.
|
||||
// Math identical to terrain.frag (Phase 3c per-cell maskBlend3 +
|
||||
// Phase G fog + lightning flash). uTerrain and uAlpha are bound via
|
||||
// glProgramUniformHandleARB on the C# side; GLSL sampling is unchanged.
|
||||
// Phase G fog + lightning flash).
|
||||
//
|
||||
// Bindless texture handles are passed as uvec2 (low/high 32 bits) and
|
||||
// reconstructed into sampler2DArray at use sites via the GLSL
|
||||
// sampler-from-handle constructor. The alternative pattern —
|
||||
// `uniform sampler2DArray` set via glProgramUniformHandleARB — produces
|
||||
// GL_INVALID_OPERATION on at least one driver in practice (NVIDIA on
|
||||
// Windows). The uvec2 + constructor pattern is what N.5's mesh_modern
|
||||
// shader uses and is the documented "always works" form per the
|
||||
// ARB_bindless_texture spec.
|
||||
|
||||
in vec2 vBaseUV;
|
||||
in vec3 vWorldNormal;
|
||||
|
|
@ -19,8 +27,10 @@ flat in float vBaseTexIdx;
|
|||
|
||||
out vec4 fragColor;
|
||||
|
||||
uniform sampler2DArray uTerrain;
|
||||
uniform sampler2DArray uAlpha;
|
||||
uniform uvec2 uTerrainHandle;
|
||||
uniform uvec2 uAlphaHandle;
|
||||
#define uTerrain sampler2DArray(uTerrainHandle)
|
||||
#define uAlpha sampler2DArray(uAlphaHandle)
|
||||
|
||||
struct Light {
|
||||
vec4 posAndKind;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue