playcanvas
Version:
PlayCanvas WebGL game engine
3 lines (2 loc) • 4.36 kB
TypeScript
declare const _default: "\n\n#define GSPLAT_CENTER_NOPROJ\n\n#include \"gsplatStructsVS\"\n#include \"gsplatCenterVS\"\n#include \"gsplatEvalSHVS\"\n#include \"gsplatQuatToMat3VS\"\n#include \"gsplatSourceFormatVS\"\n#include \"packHalfPS\"\n\nuniform int uStartLine; // Start row in destination texture\nuniform int uViewportWidth; // Width of the destination viewport in pixels\n\n#ifdef GSPLAT_LOD\n // LOD intervals texture\n uniform usampler2D uIntervalsTexture;\n#endif\n\nuniform vec3 uColorMultiply;\n\n// number of splats\nuniform int uActiveSplats;\n\nvoid main(void) {\n // local fragment coordinates (within the viewport)\n ivec2 localFragCoords = ivec2(int(gl_FragCoord.x), int(gl_FragCoord.y) - uStartLine);\n\n // linear index of the splat\n int targetIndex = localFragCoords.y * uViewportWidth + localFragCoords.x;\n if (targetIndex >= uActiveSplats) {\n\n // Out of bounds: write zeros\n #ifdef GSPLAT_COLOR_UINT\n pcFragColor0 = uvec4(0u);\n #else\n pcFragColor0 = vec4(0.0);\n #endif\n #ifndef GSPLAT_COLOR_ONLY\n pcFragColor1 = uvec4(0u);\n pcFragColor2 = uvec2(0u);\n #endif\n\n } else {\n\n #ifdef GSPLAT_LOD\n // Use intervals texture to remap target index to source index\n int intervalsSize = int(textureSize(uIntervalsTexture, 0).x);\n ivec2 intervalUV = ivec2(targetIndex % intervalsSize, targetIndex / intervalsSize);\n uint originalIndex = texelFetch(uIntervalsTexture, intervalUV, 0).r;\n #else\n uint originalIndex = uint(targetIndex);\n #endif\n \n // source texture size\n #if defined(GSPLAT_SOGS_DATA) || defined(GSPLAT_COMPRESSED_DATA)\n uint srcSize = uint(textureSize(packedTexture, 0).x);\n #else\n uint srcSize = uint(textureSize(splatColor, 0).x);\n #endif\n \n // Create SplatSource used to sample splat data textures\n SplatSource source;\n source.id = uint(originalIndex);\n source.uv = ivec2(source.id % srcSize, source.id / srcSize);\n\n // read center in local space\n vec3 modelCenter = readCenter(source);\n\n // compute world-space center for storage\n vec3 worldCenter = (matrix_model * vec4(modelCenter, 1.0)).xyz;\n SplatCenter center;\n initCenter(modelCenter, center);\n\n // read and transform covariance\n vec3 covA, covB;\n readCovariance(source, covA, covB);\n\n mat3 C = mat3(\n covA.x, covA.y, covA.z,\n covA.y, covB.x, covB.y,\n covA.z, covB.y, covB.z\n );\n mat3 linear = mat3(matrix_model);\n mat3 Ct = linear * C * transpose(linear);\n covA = Ct[0];\n covB = vec3(Ct[1][1], Ct[1][2], Ct[2][2]);\n\n // read color\n vec4 color = readColor(source);\n\n // evaluate spherical harmonics\n #if SH_BANDS > 0\n // calculate the model-space view direction\n vec3 dir = normalize(center.view * mat3(center.modelView));\n\n // read sh coefficients\n vec3 sh[SH_COEFFS];\n float scale;\n readSHData(source, sh, scale);\n\n // evaluate\n color.xyz += evalSH(sh, dir) * scale;\n #endif\n\n color.xyz *= uColorMultiply;\n\n // write out results\n #ifdef GSPLAT_COLOR_UINT\n // Pack RGBA as 4x half-float (16-bit) values for RGBA16U format\n uint packed_rg = packHalf2x16(color.rg);\n uint packed_ba = packHalf2x16(color.ba);\n pcFragColor0 = uvec4(\n packed_rg & 0xFFFFu, // R as half\n packed_rg >> 16u, // G as half\n packed_ba & 0xFFFFu, // B as half\n packed_ba >> 16u // A as half\n );\n #else\n pcFragColor0 = color;\n #endif\n #ifndef GSPLAT_COLOR_ONLY\n pcFragColor1 = uvec4(floatBitsToUint(worldCenter.x), floatBitsToUint(worldCenter.y), floatBitsToUint(worldCenter.z), packHalf2x16Safe(vec2(covA.z, covB.z)));\n pcFragColor2 = uvec2(packHalf2x16Safe(covA.xy), packHalf2x16Safe(covB.xy));\n #endif\n }\n}\n";
export default _default;