UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

3 lines (2 loc) 2.18 kB
declare const _default: "\n\nprecision highp usampler2D;\n\n// RG32U: (start, accumulatedSum)\nuniform usampler2D uIntervalsTexture;\nuniform int uNumIntervals;\nuniform int uTextureWidth;\nuniform int uActiveSplats;\n\nivec2 getCoordFromIndex(int index, int textureWidth) {\n return ivec2(index % textureWidth, index / textureWidth);\n}\n\nvoid main() {\n ivec2 coord = ivec2(gl_FragCoord.xy);\n int targetIndex = coord.y * uTextureWidth + coord.x;\n \n if (targetIndex >= uActiveSplats) {\n gl_FragColor = 0u;\n return;\n }\n \n // Binary search through accumulated sums (G channel)\n int left = 0;\n int right = uNumIntervals - 1;\n int intervalIndex = 0;\n \n while (left <= right) {\n int mid = (left + right) / 2;\n \n int textureWidth = textureSize(uIntervalsTexture, 0).x;\n ivec2 intervalCoord = getCoordFromIndex(mid, textureWidth);\n uvec2 intervalData = texelFetch(uIntervalsTexture, intervalCoord, 0).rg;\n \n uint accumulatedSum = intervalData.g; // G channel\n \n if (uint(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 int textureWidth = textureSize(uIntervalsTexture, 0).x;\n ivec2 intervalCoord = getCoordFromIndex(intervalIndex, textureWidth);\n uvec2 intervalData = texelFetch(uIntervalsTexture, intervalCoord, 0).rg;\n \n uint intervalStart = intervalData.r; // R channel\n uint currentAccSum = intervalData.g; // G channel\n \n // Get previous accumulated sum\n uint prevAccSum = 0u;\n if (intervalIndex > 0) {\n ivec2 prevCoord = getCoordFromIndex(intervalIndex - 1, textureWidth);\n prevAccSum = texelFetch(uIntervalsTexture, prevCoord, 0).g;\n }\n \n // Calculate original splat index\n uint offsetInInterval = uint(targetIndex) - prevAccSum;\n uint originalIndex = intervalStart + offsetInInterval;\n \n gl_FragColor = originalIndex;\n}\n"; export default _default;