playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
43 lines (41 loc) • 1.35 kB
JavaScript
var gsplatSogVS = `
uniform vec3 means_mins;
uniform vec3 means_maxs;
uniform float scales_mins;
uniform float scales_maxs;
uniform float sh0_mins;
uniform float sh0_maxs;
uniform highp sampler2D packedSh0;
const float SH_C0 = 0.28209479177387814;
uvec4 packedSample;
const float norm = sqrt(2.0);
vec3 getCenter() {
packedSample = loadPackedTexture();
vec3 l = unpack8888(packedSample.x).xyz;
vec3 u = unpack8888(packedSample.y).xyz;
vec3 n = (l + u * 256.0) / 257.0;
vec3 v = mix(means_mins, means_maxs, n);
return sign(v) * (exp(abs(v)) - 1.0);
}
vec4 getColor() {
vec3 clr = mix(vec3(sh0_mins), vec3(sh0_maxs), unpack111110(pack8888(texelFetch(packedSh0, splat.uv, 0))));
float alpha = float(packedSample.z & 0xffu) / 255.0;
return vec4(vec3(0.5) + clr * SH_C0, alpha);
}
vec4 getRotation() {
vec3 qdata = unpack8888(packedSample.z).xyz;
uint qmode = packedSample.w & 0x3u;
vec3 abc = (qdata - 0.5) * norm;
float d = sqrt(max(0.0, 1.0 - dot(abc, abc)));
return (qmode == 0u) ? vec4(d, abc) :
((qmode == 1u) ? vec4(abc.x, d, abc.yz) :
((qmode == 2u) ? vec4(abc.xy, d, abc.z) : vec4(abc, d)));
}
vec3 getScale() {
vec3 sdata = unpack101010(packedSample.w >> 2u);
return exp(mix(vec3(scales_mins), vec3(scales_maxs), sdata));
}
`;
export { gsplatSogVS as default };