UNPKG

playcanvas

Version:

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

51 lines (49 loc) 1.58 kB
var gsplatSogVS = ` #include "gsplatPackingPS" uniform means_mins: vec3f; uniform means_maxs: vec3f; uniform scales_mins: f32; uniform scales_maxs: f32; uniform sh0_mins: f32; uniform sh0_maxs: f32; var packedSh0: texture_2d<f32>; const SH_C0: f32 = 0.28209479177387814; var<private> packedSample: vec4<u32>; const norm: f32 = sqrt(2.0); fn getCenter() -> vec3f { packedSample = loadPackedTexture(); let l = unpack8888(packedSample.x).xyz; let u = unpack8888(packedSample.y).xyz; let n = (l + u * 256.0) / 257.0; let v = mix(uniform.means_mins, uniform.means_maxs, n); return sign(v) * (exp(abs(v)) - 1.0); } fn getColor() -> vec4f { let clr = mix(half3(half(uniform.sh0_mins)), half3(half(uniform.sh0_maxs)), half3(unpack111110(pack8888(textureLoad(packedSh0, splat.uv, 0))))); let alpha = half(f32(packedSample.z & 0xffu) / 255.0); return vec4f(half4(half3(0.5) + clr * half(SH_C0), alpha)); } fn getRotation() -> vec4f { let qdata = unpack8888(packedSample.z).xyz; let qmode = packedSample.w & 0x3u; let abc = (qdata - 0.5) * norm; let d = sqrt(max(0.0, 1.0 - dot(abc, abc))); var quat: vec4f; if (qmode == 0u) { quat = vec4f(d, abc); } else if (qmode == 1u) { quat = vec4f(abc.x, d, abc.y, abc.z); } else if (qmode == 2u) { quat = vec4f(abc.x, abc.y, d, abc.z); } else { quat = vec4f(abc.x, abc.y, abc.z, d); } return quat; } fn getScale() -> vec3f { let sdata = unpack101010(packedSample.w >> 2u); return exp(mix(vec3f(uniform.scales_mins), vec3f(uniform.scales_maxs), sdata)); } #include "gsplatSogSHVS" `; export { gsplatSogVS as default };