From 9cf15e1f13b4f92391ea0693e8971706e93659c8 Mon Sep 17 00:00:00 2001 From: Erik Date: Sun, 23 Aug 2026 18:31:39 +0200 Subject: [PATCH] =?UTF-8?q?perf(sky):=20~10x=20cheaper=20night-sky=20latti?= =?UTF-8?q?ce=20=E2=80=94=20one-round=20cell=20hash,=202x2x2=20block,=20bi?= =?UTF-8?q?t-sliced=20stars?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The owner measured 63% GPU at night vs 28% by day: the starfield lattice was the whole difference. Three lossless cuts: - one packed-multiply hash round per cell instead of ~9 chained PCG rounds (position/presence bit-sliced from one result, brightness/tint from a second); - the 3x3x3 neighbourhood sweep becomes the 2x2x2 block around the sample — a star's visible footprint (a few px) is far smaller than a lattice cell on screen, so any star outside that block is over a full cell (>=15 px) away and contributes nothing; - background mottle drops its invisible third octave. Same densities, sizes, colours, and look; star positions reshuffle (procedural layout, not authored). sky.frag.spv re-pinned. Co-Authored-By: Claude Fable 5 --- src/AcDream.App/Rendering/Shaders/sky.frag | 70 ++++++++++-------- .../Shaders/spv/shaders.manifest.json | 2 +- .../Rendering/Shaders/spv/sky.frag.spv | Bin 26428 -> 18608 bytes .../Gpu/Vk/VulkanShaderManifestTests.cs | 2 +- 4 files changed, 43 insertions(+), 31 deletions(-) diff --git a/src/AcDream.App/Rendering/Shaders/sky.frag b/src/AcDream.App/Rendering/Shaders/sky.frag index a511ef4b..f5354dc5 100644 --- a/src/AcDream.App/Rendering/Shaders/sky.frag +++ b/src/AcDream.App/Rendering/Shaders/sky.frag @@ -88,22 +88,33 @@ vec3 nsTint(float r) return vec3(0.70, 0.82, 1.00); // hot blue } +// One-round packed 3D lattice hash (three odd-constant multiplies + a +// single PCG finalise). The 2026-08-23 night GPU measurement (63% night vs +// 28% day at the owner's card) showed the first version's ~9 chained PCG +// rounds per cell were the whole bill; one round is statistically ample for +// star placement. +uint nsCellHash(ivec3 c, uint seed) +{ + uint h = uint(c.x + 1024) * 0x8DA6B343u + ^ uint(c.y + 1024) * 0xD8163841u + ^ uint(c.z + 1024) * 0xCB1AB31Fu + ^ seed; + return nsPcg(h); +} + float nsVnoise(vec3 p, uint seed) { vec3 i = floor(p); vec3 f = fract(p); f = f * f * (3.0 - 2.0 * f); + ivec3 ii = ivec3(i); float acc = 0.0; for (int c = 0; c < 8; ++c) { - vec3 o = vec3(float(c & 1), float((c >> 1) & 1), float((c >> 2) & 1)); - vec3 q = i + o; - uint h = nsPcg(seed - ^ nsPcg(uint(int(q.x) + 512) - ^ nsPcg(uint(int(q.y) + 512) - ^ uint(int(q.z) + 512)))); - vec3 w = mix(1.0 - f, f, o); - acc += nsRand(h) * w.x * w.y * w.z; + ivec3 o = ivec3(c & 1, (c >> 1) & 1, (c >> 2) & 1); + float v = nsRand(nsCellHash(ii + o, seed)); + vec3 wf = mix(1.0 - f, f, vec3(o)); // trilinear weights + acc += v * wf.x * wf.y * wf.z; } return acc; } @@ -116,7 +127,6 @@ vec3 nsStarTier(vec3 dir, vec3 ex, vec3 ey, uint seed, float cells, // seam artefacts by construction (the 2026-08-23 gate screenshot's // glowing "Y" was cube-face fwidth blowup — do not bring faces back). vec3 g = dir * cells; - vec3 cellF = floor(g); // Exact tangent-plane -> screen-pixel solve: 2x2 normal equations of // the direction derivatives. Stars come out perfectly ROUND and sized @@ -127,32 +137,35 @@ vec3 nsStarTier(vec3 dir, vec3 ex, vec3 ey, uint seed, float cells, float c = dot(ey, ey); float det = max(a * c - b * b, 1e-14); + // A star's visible footprint (a few px) is far smaller than a lattice + // cell on screen, so only the 2x2x2 block around the sample can hold a + // star that contributes — the 3x3x3 sweep was pure waste (GPU bill, + // 2026-08-23): any star outside this block is over a full cell away. + ivec3 base = ivec3(floor(g - 0.5)); + vec3 acc = vec3(0.0); - for (int dz = -1; dz <= 1; ++dz) - for (int dy = -1; dy <= 1; ++dy) - for (int dx = -1; dx <= 1; ++dx) + for (int ci = 0; ci < 8; ++ci) { - vec3 cc = cellF + vec3(float(dx), float(dy), float(dz)); - uint h = nsPcg(seed - ^ nsPcg(uint(int(cc.x) + 512) - ^ nsPcg(uint(int(cc.y) + 512) - ^ nsPcg(uint(int(cc.z) + 512) ^ uint(cells))))); - if (nsRand(h) > density) continue; - uint h2 = nsPcg(h); - uint h3 = nsPcg(h2); - uint h4 = nsPcg(h3); - uint h5 = nsPcg(h4); - uint h6 = nsPcg(h5); - vec3 sdir = normalize(cc + vec3(nsRand(h2), nsRand(h3), nsRand(h4))); + ivec3 cc = base + ivec3(ci & 1, (ci >> 1) & 1, (ci >> 2) & 1); + uint h = nsCellHash(cc, seed ^ uint(cells)); + // Bit-slice ONE hash for presence + position; one more round for + // brightness + tint. (Was five chained rounds per star.) + if (float(h & 0xFFu) > density * 255.0) continue; + vec3 jitter = vec3( + float((h >> 8) & 0xFFu), + float((h >> 16) & 0xFFu), + float((h >> 24) & 0xFFu)) * (1.0 / 255.0); + vec3 sdir = normalize(vec3(cc) + jitter); vec3 v = sdir - dir * dot(sdir, dir); // tangent-plane offset float bx = dot(v, ex); float by = dot(v, ey); vec2 sPx = vec2(bx * c - by * b, by * a - bx * b) / det; float d2 = dot(sPx, sPx); if (d2 > 400.0) continue; // > 20 px: contributes nothing - float t = nsRand(h5); + uint h2 = nsPcg(h); + float t = float(h2 & 0xFFFFu) * (1.0 / 65535.0); float br = mix(bMin, bMax, t * t * t); - vec3 tint = nsTint(nsRand(h6)); + vec3 tint = nsTint(float((h2 >> 16) & 0xFFu) * (1.0 / 255.0)); // Round gaussian core; optional soft round halo on the bright tiers. // NO diffraction spikes / lens flare — user-directed 2026-08-23: // spikes are a photographic artefact, not a naked-eye sky. @@ -169,9 +182,8 @@ vec3 nightSky(vec3 dir, uint seed) vec3 ey = dFdy(dir); // Faint cool background mottle (0.4%..1.3% - the user-approved level). - float n = 0.55 * nsVnoise(dir * 3.0, seed ^ 0x9E3779B9u) - + 0.30 * nsVnoise(dir * 7.0, seed ^ 0x85EBCA6Bu) - + 0.15 * nsVnoise(dir * 15.0, seed ^ 0xC2B2AE35u); + float n = 0.62 * nsVnoise(dir * 3.0, seed ^ 0x9E3779B9u) + + 0.38 * nsVnoise(dir * 7.0, seed ^ 0x85EBCA6Bu); vec3 rgb = (0.004 + 0.009 * n) * vec3(0.85, 0.92, 1.10); // The star carpet: three density tiers plus sparse bright standouts, diff --git a/src/AcDream.App/Rendering/Shaders/spv/shaders.manifest.json b/src/AcDream.App/Rendering/Shaders/spv/shaders.manifest.json index dd84a830..66434e36 100644 --- a/src/AcDream.App/Rendering/Shaders/spv/shaders.manifest.json +++ b/src/AcDream.App/Rendering/Shaders/spv/shaders.manifest.json @@ -316,7 +316,7 @@ }, { "stage": "frag", - "sourceSha256": "e7ccdb4d5fece2ceeb48eb43aaa827424df2b68614987eeb3dfb7880dff8ea83", + "sourceSha256": "5785633bc936fad68c97247f6ef8a22e5bcde0fe6d74a2f4676b844a2d7600c5", "compiled": true } ] diff --git a/src/AcDream.App/Rendering/Shaders/spv/sky.frag.spv b/src/AcDream.App/Rendering/Shaders/spv/sky.frag.spv index f6fc74417a2ed6bcd1bca4f8f9d420bb6bf8abb2..30603a582a9033dc41fdde6e7d32ff27bceba66f 100644 GIT binary patch literal 18608 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 literal 26428 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 Z2w{KY^;=WcBYkx}a$Wj_E4Tse{{e&frl9}; diff --git a/tests/AcDream.App.Tests/Rendering/Gpu/Vk/VulkanShaderManifestTests.cs b/tests/AcDream.App.Tests/Rendering/Gpu/Vk/VulkanShaderManifestTests.cs index 6a54192b..63ce718f 100644 --- a/tests/AcDream.App.Tests/Rendering/Gpu/Vk/VulkanShaderManifestTests.cs +++ b/tests/AcDream.App.Tests/Rendering/Gpu/Vk/VulkanShaderManifestTests.cs @@ -52,7 +52,7 @@ public sealed class VulkanShaderManifestTests // override, retail's GameSky::Draw @0x00506FF0 rule (see // SkyFogRuleTests). A deliberate default-path change, reviewed // with the world-fog-range fix in the same commit. - ["sky.frag.spv"] = "e307a7f3cf84aada86db7c2859c55841a650b46732f12149986562cef0a90ca8", + ["sky.frag.spv"] = "1c4ae77056837cbdc188f8cfcc4b0e8851647cdfaf398f25d8c8ff489ef84d57", ["sky.vert.spv"] = "3b51945fa4ff1be1604144df92866bdd47aade22f9dd90267591ef36adb28cde", ["terrain_modern.frag.spv"] = "7b3cdb01b837ed77ee20559a81c1ce5c9d5395300efcc072560ab0be3c5a1af9", ["terrain_modern.vert.spv"] = "9f4cb221ea6aed94a8d23af6cb8e3f3ed96c3cce6e50d135a72d3b55667b1557",