UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

3 lines (2 loc) 2.34 kB
declare const _default: "\n\n// RG32U: (start, accumulatedSum)\nvar uIntervalsTexture: texture_2d<u32>;\nuniform uNumIntervals: i32;\nuniform uTextureWidth: i32;\nuniform uActiveSplats: i32;\n\nfn getCoordFromIndex(index: i32, textureWidth: i32) -> vec2i {\n return vec2i(index % textureWidth, index / textureWidth);\n}\n\n@fragment\nfn fragmentMain(input: FragmentInput) -> FragmentOutput {\n var output: FragmentOutput;\n \n let coord = vec2i(i32(input.position.x), i32(input.position.y));\n let targetIndex = coord.y * uniform.uTextureWidth + coord.x;\n \n if (targetIndex >= uniform.uActiveSplats) {\n output.color = 0u;\n return output;\n }\n \n // Binary search through accumulated sums (G channel)\n var left = 0i;\n var right = uniform.uNumIntervals - 1;\n var intervalIndex = 0i;\n \n while (left <= right) {\n let mid = (left + right) / 2;\n \n let textureWidth = i32(textureDimensions(uIntervalsTexture, 0).x);\n let intervalCoord = getCoordFromIndex(mid, textureWidth);\n let intervalData = textureLoad(uIntervalsTexture, intervalCoord, 0).rg;\n \n let accumulatedSum = intervalData.g; // G channel\n \n if (u32(targetIndex) < accumulatedSum) {\n intervalIndex = mid;\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n \n // Get interval data (both start and accumulated sum in one fetch)\n let textureWidth = i32(textureDimensions(uIntervalsTexture, 0).x);\n let intervalCoord = getCoordFromIndex(intervalIndex, textureWidth);\n let intervalData = textureLoad(uIntervalsTexture, intervalCoord, 0).rg;\n \n let intervalStart = intervalData.r; // R channel\n let currentAccSum = intervalData.g; // G channel\n \n // Get previous accumulated sum\n var prevAccSum = 0u;\n if (intervalIndex > 0) {\n let prevCoord = getCoordFromIndex(intervalIndex - 1, textureWidth);\n prevAccSum = textureLoad(uIntervalsTexture, prevCoord, 0).g;\n }\n \n // Calculate original splat index\n let offsetInInterval = u32(targetIndex) - prevAccSum;\n let originalIndex = intervalStart + offsetInInterval;\n \n output.color = originalIndex;\n return output;\n}\n"; export default _default;