UNPKG

playcanvas

Version:

Open-source WebGL/WebGPU 3D engine for the web

3 lines (2 loc) 2.78 kB
declare const _default: "\n// means dequantization (both V1 and V2)\nuniform means_mins: vec3f;\nuniform means_maxs: vec3f;\n\n#ifndef SOG_V2\n // V1: linear min/max dequantization (no codebooks)\n uniform scales_mins: vec3f;\n uniform scales_maxs: vec3f;\n uniform sh0_mins: vec4f;\n uniform sh0_maxs: vec4f;\n#endif\n\n// SH_C0 coefficient for 0th degree spherical harmonic\nconst SH_C0: f32 = 0.28209479177387814;\nconst norm: f32 = sqrt(2.0);\n\n#ifdef SOG_V2\n // 256x1 RGBA32F LUT:\n // .r = scales codebook, .g = sh0 codebook, .b = shN codebook, .a unused\n fn lutScales(b: i32) -> f32 { return textureLoad(sogCodebook, vec2i(b, 0), 0).r; }\n fn lutSh0(b: i32) -> f32 { return textureLoad(sogCodebook, vec2i(b, 0), 0).g; }\n fn lutShN(b: i32) -> f32 { return textureLoad(sogCodebook, vec2i(b, 0), 0).b; }\n#endif\n\n// read the model-space center of the gaussian (16-bit per-axis, low + high byte)\nfn getCenter() -> vec3f {\n let l = textureLoad(means_l, splat.uv, 0).xyz;\n let u = textureLoad(means_u, splat.uv, 0).xyz;\n let n = (l + u * 256.0) / 257.0;\n let v = mix(uniform.means_mins, uniform.means_maxs, n);\n return sign(v) * (exp(abs(v)) - 1.0);\n}\n\n// decode rotation quaternion (3 components + 2-bit mode selecting the omitted axis)\nfn getRotation() -> vec4f {\n let q = textureLoad(quats, splat.uv, 0);\n let qmode = u32(q.w * 255.0 + 0.5) - 252u;\n let abc = (q.xyz - 0.5) * norm;\n let d = sqrt(max(0.0, 1.0 - dot(abc, abc)));\n\n var quat: vec4f;\n if (qmode == 0u) {\n quat = vec4f(d, abc);\n } else if (qmode == 1u) {\n quat = vec4f(abc.x, d, abc.y, abc.z);\n } else if (qmode == 2u) {\n quat = vec4f(abc.x, abc.y, d, abc.z);\n } else {\n quat = vec4f(abc.x, abc.y, abc.z, d);\n }\n return quat;\n}\n\nfn getScale() -> vec3f {\n let s = textureLoad(scales, splat.uv, 0).xyz;\n var logS: vec3f;\n #ifdef SOG_V2\n let i = vec3i(s * 255.0 + 0.5);\n logS = vec3f(lutScales(i.x), lutScales(i.y), lutScales(i.z));\n #else\n logS = mix(uniform.scales_mins, uniform.scales_maxs, s);\n #endif\n return exp(logS);\n}\n\nfn getColor() -> vec4f {\n let c = textureLoad(sh0, splat.uv, 0);\n var rgb: vec3f;\n var alpha: f32;\n #ifdef SOG_V2\n let i = vec3i(c.xyz * 255.0 + 0.5);\n rgb = vec3f(lutSh0(i.x), lutSh0(i.y), lutSh0(i.z));\n alpha = c.w;\n #else\n rgb = mix(uniform.sh0_mins.xyz, uniform.sh0_maxs.xyz, c.xyz);\n let logitAlpha = mix(uniform.sh0_mins.w, uniform.sh0_maxs.w, c.w);\n alpha = 1.0 / (1.0 + exp(-logitAlpha));\n #endif\n return vec4f(vec3f(0.5) + rgb * SH_C0, alpha);\n}\n\n#include \"gsplatSogSHVS\"\n"; export default _default;